Fix the handle locking in stdio
Fix the handle locking in stdio to use flockfile/funlockfile internally when and where required. Macros in <stdio.h> are updated to automatically call the underlying functions when the process is threaded to obtain the necessary locking. A private mutex is added to protect __sglue, the internal list of FILE handles, and another to protect the one-time initialization. Some routines in libc that use getc() change to use getc_unlocked() as they're either protected by their own lock or aren't thread-safe routines anyway. Based on OpenBSD change by guenther@openbsd.org http://www.mail-archive.com/source-changes@cvs.openbsd.org/msg01015.html Bug: 3446659 Change-Id: Ie82116e358c541718d6709ec45ca6796be5a007b
This commit is contained in:
@@ -117,6 +117,7 @@ VFSCANF(FILE *fp, const char *fmt0, __va_list ap)
|
||||
static short basefix[17] =
|
||||
{ 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
|
||||
|
||||
FLOCKFILE(fp);
|
||||
_SET_ORIENTATION(fp, -1);
|
||||
|
||||
nassigned = 0;
|
||||
@@ -124,8 +125,10 @@ VFSCANF(FILE *fp, const char *fmt0, __va_list ap)
|
||||
base = 0; /* XXX just to keep gcc happy */
|
||||
for (;;) {
|
||||
c = *fmt++;
|
||||
if (c == 0)
|
||||
if (c == 0) {
|
||||
FUNLOCKFILE(fp);
|
||||
return (nassigned);
|
||||
}
|
||||
if (isspace(c)) {
|
||||
while ((fp->_r > 0 || __srefill(fp) == 0) &&
|
||||
isspace(*fp->_p))
|
||||
@@ -292,6 +295,7 @@ literal:
|
||||
* Disgusting backwards compatibility hacks. XXX
|
||||
*/
|
||||
case '\0': /* compat */
|
||||
FUNLOCKFILE(fp);
|
||||
return (EOF);
|
||||
|
||||
default: /* compat */
|
||||
@@ -689,8 +693,10 @@ literal:
|
||||
}
|
||||
}
|
||||
input_failure:
|
||||
return (nassigned ? nassigned : -1);
|
||||
if (nassigned == 0)
|
||||
nassigned = -1;
|
||||
match_failure:
|
||||
FUNLOCKFILE(fp);
|
||||
return (nassigned);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user