[RFA]: race safe fwalk
Jeff Johnston
jjohnstn@redhat.com
Tue Mar 9 22:49:00 GMT 2004
Thomas Pfaff wrote:
> This time with attachment.
>
> There is a possible race between fwalk and fopen:
>
> When a thread make a call to fopen the FILE * _flags will be set to 1 in
> findfp to mark it used and later it will be changed to the real FILE flag.
>
> When another thread calls fwalk during that time fwalk will treat the
> FILE as already opened and calls the callback functions with the yet
> unopened and only partially initialized FILE *.
>
> This can be avoided by checking for fp->_flags != 0 && fp->_flags != 1.
> Since _flags is signed short i did not check for _flags > 1. The flag
> should be set as the last step in an open call.
> I do not think that 1 is a valid _flag for an open file. Correct me if
> am wrong.
>
Unfortunately, 1 is also line-buffered: __SLBF.
What if instead, we use the _file field to check for a valid file. It gets set
to -1 by __sfp. Now, if we set _file inside the __sfp_lock and then had fwalk()
use the __sfp lock as well and check for _file != -1, plus have the open
routines set the _file field last, this should work equally as well. Comments?
-- Jeff J.
> 2004-03-08 Thomas Pfaff <tpfaff@gmx.net>
>
> * libc/stdio/fdopen.c (_fdopen_r): Add missing
> __lock_init_recursive.
> Set FILE flags as the last step.
> * libc/stdio/fopen.c (_fopen_r): Set FILE flags as the last
> step.
> * libc/stdio/fwalk.c: Check for _flags != 1 to make sure that
> file is really open.
> * libc/stdio64/fdopen64.c (_fdopen64_r): Set FILE flags as the
> last step.
> * libc/stdio64/fopen64.c (_fopen64_r): Ditto.
>
More information about the Newlib
mailing list