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).
This commit is contained in:
parent
43acc706ac
commit
59fac1825f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=126760
@ -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:
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user