diff options
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); } |