From bcde12940007e836f7b831f1cdfda8dc2bda0c58 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Fri, 24 Apr 2009 22:52:52 +0000 Subject: 2009-04-24 Jeff johnston * libc/stdio/fgetc.c: Make sure sfp lock is acquired before the file lock and released before the file lock to avoid a deadlock scenario. * libc/stdio/fgets.c: Ditto. * libc/stdio/fgetwc.c: Ditto. * libc/stdio/fgetws.c: Ditto. * libc/stdio/fread.c: Ditto. * libc/stdio/fseek.c: Ditto. * libc/stdio/getc.c: Ditto. * libc/stdio/getdelim.c: Ditto. * libc/stdio/gets.c: Ditto. --- newlib/libc/stdio/fseek.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'newlib/libc/stdio/fseek.c') diff --git a/newlib/libc/stdio/fseek.c b/newlib/libc/stdio/fseek.c index 4d5fda4fe..526ae4ccb 100644 --- a/newlib/libc/stdio/fseek.c +++ b/newlib/libc/stdio/fseek.c @@ -138,6 +138,7 @@ _DEFUN(_fseek_r, (ptr, fp, offset, whence), CHECK_INIT (ptr, fp); + __sfp_lock_acquire (); _flockfile (fp); /* If we've been doing some writing, and we're in append mode @@ -155,6 +156,7 @@ _DEFUN(_fseek_r, (ptr, fp, offset, whence), { ptr->_errno = ESPIPE; /* ??? */ _funlockfile (fp); + __sfp_lock_release (); return EOF; } @@ -180,6 +182,7 @@ _DEFUN(_fseek_r, (ptr, fp, offset, whence), if (curoff == -1L) { _funlockfile (fp); + __sfp_lock_release (); return EOF; } } @@ -205,6 +208,7 @@ _DEFUN(_fseek_r, (ptr, fp, offset, whence), default: ptr->_errno = EINVAL; _funlockfile (fp); + __sfp_lock_release (); return (EOF); } @@ -263,6 +267,8 @@ _DEFUN(_fseek_r, (ptr, fp, offset, whence), if ((long)target != target) { ptr->_errno = EOVERFLOW; + _funlockfile (fp); + __sfp_lock_release (); return EOF; } @@ -319,6 +325,7 @@ _DEFUN(_fseek_r, (ptr, fp, offset, whence), fp->_flags &= ~__SEOF; memset (&fp->_mbstate, 0, sizeof (_mbstate_t)); _funlockfile (fp); + __sfp_lock_release (); return 0; } @@ -349,6 +356,7 @@ _DEFUN(_fseek_r, (ptr, fp, offset, whence), } memset (&fp->_mbstate, 0, sizeof (_mbstate_t)); _funlockfile (fp); + __sfp_lock_release (); return 0; /* @@ -361,6 +369,7 @@ dumb: || seekfn (ptr, fp->_cookie, offset, whence) == POS_ERR) { _funlockfile (fp); + __sfp_lock_release (); return EOF; } /* success: clear EOF indicator and discard ungetc() data */ @@ -379,6 +388,7 @@ dumb: fp->_flags &= ~__SNPT; memset (&fp->_mbstate, 0, sizeof (_mbstate_t)); _funlockfile (fp); + __sfp_lock_release (); return 0; } -- cgit v1.2.3