diff options
author | 2009-10-21 16:04:23 +0000 | |
---|---|---|
committer | 2009-10-21 16:04:23 +0000 | |
commit | 9962e7fd037872c423544f61cba1c901b045363a (patch) | |
tree | ce799ea09983ba455c4a97b46913cf18ffa2a841 /lib/libc/stdio/fseek.c | |
parent | "usage:" is lowercase; spacing. (diff) | |
download | wireguard-openbsd-9962e7fd037872c423544f61cba1c901b045363a.tar.xz wireguard-openbsd-9962e7fd037872c423544f61cba1c901b045363a.zip |
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.
ok kurt@, earlier version tested by sthen@ and jj@
Diffstat (limited to 'lib/libc/stdio/fseek.c')
-rw-r--r-- | lib/libc/stdio/fseek.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/libc/stdio/fseek.c b/lib/libc/stdio/fseek.c index 4f5014d6e0c..525c095f895 100644 --- a/lib/libc/stdio/fseek.c +++ b/lib/libc/stdio/fseek.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fseek.c,v 1.7 2005/08/08 08:05:36 espie Exp $ */ +/* $OpenBSD: fseek.c,v 1.8 2009/10/21 16:04:23 guenther Exp $ */ /*- * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -70,6 +70,7 @@ fseeko(FILE *fp, off_t offset, int whence) * Change any SEEK_CUR to SEEK_SET, and check `whence' argument. * After this, whence is either SEEK_SET or SEEK_END. */ + FLOCKFILE(fp); switch (whence) { case SEEK_CUR: @@ -83,8 +84,10 @@ fseeko(FILE *fp, off_t offset, int whence) curoff = fp->_offset; else { curoff = (*seekfn)(fp->_cookie, (fpos_t)0, SEEK_CUR); - if (curoff == (fpos_t)-1) + if (curoff == (fpos_t)-1) { + FUNLOCKFILE(fp); return (EOF); + } } if (fp->_flags & __SRD) { curoff -= fp->_r; @@ -105,6 +108,7 @@ fseeko(FILE *fp, off_t offset, int whence) break; default: + FUNLOCKFILE(fp); errno = EINVAL; return (EOF); } @@ -189,6 +193,7 @@ fseeko(FILE *fp, off_t offset, int whence) if (HASUB(fp)) FREEUB(fp); fp->_flags &= ~__SEOF; + FUNLOCKFILE(fp); return (0); } @@ -215,6 +220,7 @@ fseeko(FILE *fp, off_t offset, int whence) fp->_p += n; fp->_r -= n; } + FUNLOCKFILE(fp); return (0); /* @@ -224,6 +230,7 @@ fseeko(FILE *fp, off_t offset, int whence) dumb: if (__sflush(fp) || (*seekfn)(fp->_cookie, (fpos_t)offset, whence) == POS_ERR) { + FUNLOCKFILE(fp); return (EOF); } /* success: clear EOF indicator and discard ungetc() data */ @@ -233,6 +240,7 @@ dumb: fp->_r = 0; /* fp->_w = 0; */ /* unnecessary (I think...) */ fp->_flags &= ~__SEOF; + FUNLOCKFILE(fp); return (0); } |