From 59fac1825f4658dfb5d2abddba5125ef493059db Mon Sep 17 00:00:00 2001 From: John Birrell Date: Tue, 9 Mar 2004 02:44:59 +0000 Subject: [PATCH] On 4.X it was possible for an application to initialise a local FILE structure and call stdio functions. In 5.X this was broken when FILE locking was introduced into libc. This change makes most (relevant) stdio functions work again when the _extra file in FILE isn't initialised (and can't be without a libc function to do it since the __sFILEX structure is private to libc). --- lib/libc/stdio/_flock_stub.c | 12 +++++++++--- lib/libc/stdio/local.h | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/libc/stdio/_flock_stub.c b/lib/libc/stdio/_flock_stub.c index 8abc8e3b638..1b79ce22719 100644 --- a/lib/libc/stdio/_flock_stub.c +++ b/lib/libc/stdio/_flock_stub.c @@ -73,7 +73,9 @@ _flockfile(FILE *fp) { pthread_t curthread = _pthread_self(); - if (fp->_lock->fl_owner == curthread) + if (fp->_lock == NULL) { + } + else if (fp->_lock->fl_owner == curthread) fp->_lock->fl_count++; else { /* @@ -101,7 +103,9 @@ _ftrylockfile(FILE *fp) pthread_t curthread = _pthread_self(); int ret = 0; - if (fp->_lock->fl_owner == curthread) + if (fp->_lock == NULL) { + } + else if (fp->_lock->fl_owner == curthread) fp->_lock->fl_count++; /* * Make sure this mutex is treated as a private @@ -121,10 +125,12 @@ _funlockfile(FILE *fp) { pthread_t curthread = _pthread_self(); + if (fp->_lock == NULL) { + } /* * Check if this file is owned by the current thread: */ - if (fp->_lock->fl_owner == curthread) { + else if (fp->_lock->fl_owner == curthread) { /* * Check if this thread has locked the FILE * more than once: diff --git a/lib/libc/stdio/local.h b/lib/libc/stdio/local.h index 9e1cad44a53..2cf2637a8e1 100644 --- a/lib/libc/stdio/local.h +++ b/lib/libc/stdio/local.h @@ -143,6 +143,6 @@ struct __sFILEX { * orientation. If o < 0, the stream has byte-orientation. */ #define ORIENT(fp, o) do { \ - if ((fp)->_extra->orientation == 0) \ + if ((fp)->_extra != NULL && (fp)->_extra->orientation == 0) \ (fp)->_extra->orientation = (o); \ } while (0)