summaryrefslogtreecommitdiffstats
path: root/newlib/libc/stdio/fseek.c
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2009-04-24 22:52:52 +0000
committerJeff Johnston <jjohnstn@redhat.com>2009-04-24 22:52:52 +0000
commitbcde12940007e836f7b831f1cdfda8dc2bda0c58 (patch)
treed9894d46eb51edf603939d8506bf0b5f97b9fa87 /newlib/libc/stdio/fseek.c
parent35f31b6a983710aa9a2bd7e308d1567f326f3f5f (diff)
downloadcygnal-bcde12940007e836f7b831f1cdfda8dc2bda0c58.tar.gz
cygnal-bcde12940007e836f7b831f1cdfda8dc2bda0c58.tar.bz2
cygnal-bcde12940007e836f7b831f1cdfda8dc2bda0c58.zip
2009-04-24 Jeff johnston <jjohnstn@redhat.com>
* 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.
Diffstat (limited to 'newlib/libc/stdio/fseek.c')
-rw-r--r--newlib/libc/stdio/fseek.c10
1 files changed, 10 insertions, 0 deletions
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;
}