Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/newlib
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-07-01 16:35:00 +0300
committerCorinna Vinschen <corinna@vinschen.de>2015-07-02 10:38:06 +0300
commit757c0871f74c3a2d682398490bcae8873d1fafd4 (patch)
treeddb8fe5fd222b13cc247c14e08b2f4aab8ec97aa /newlib
parentfc22f775032cff7100166c32ab562b48578ee0dc (diff)
Prevent use of uninitialized file lock
The CHECK_INIT() is necessary before the _newlib_flockfile_start() since this would use otherwise acquire an uninitialized lock which gets initialized after this leading to a corrupt release. newlib/ChangeLog 2015-07-01 Sebastian Huber <sebastian.huber@embedded-brains.de> libc/stdio/fputs.c (_puts_r): Add missing CHECK_INIT(). libc/stdio/gets.c (_gets_r): Add missing _REENT_SMALL_CHECK_INIT() and CHECK_INIT(). Use _stdin_r() to get the file pointer instead of stdin. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'newlib')
-rw-r--r--newlib/ChangeLog6
-rw-r--r--newlib/libc/stdio/gets.c12
-rw-r--r--newlib/libc/stdio/puts.c2
3 files changed, 16 insertions, 4 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index 1d2afe037..9ada9de83 100644
--- a/newlib/ChangeLog
+++ b/newlib/ChangeLog
@@ -1,3 +1,9 @@
+2015-07-01 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ * libc/stdio/fputs.c (_puts_r): Add missing CHECK_INIT().
+ * libc/stdio/gets.c (_gets_r): Add missing _REENT_SMALL_CHECK_INIT() and
+ CHECK_INIT(). Use _stdin_r() to get the file pointer instead of stdin.
+
2015-06-29 Jon Turney <jon.turney@dronecode.org.uk>
* libc/ctype/Makefile.in: Regenerate.
diff --git a/newlib/libc/stdio/gets.c b/newlib/libc/stdio/gets.c
index f51d46196..6c21f3e0c 100644
--- a/newlib/libc/stdio/gets.c
+++ b/newlib/libc/stdio/gets.c
@@ -79,13 +79,17 @@ _DEFUN(_gets_r, (ptr, buf),
{
register int c;
register char *s = buf;
+ FILE *fp;
- _newlib_flockfile_start (stdin);
- while ((c = __sgetc_r (ptr, stdin)) != '\n')
+ _REENT_SMALL_CHECK_INIT (ptr);
+ fp = _stdin_r (ptr);
+ CHECK_INIT (ptr, fp);
+ _newlib_flockfile_start (fp);
+ while ((c = __sgetc_r (ptr, fp)) != '\n')
if (c == EOF)
if (s == buf)
{
- _newlib_flockfile_exit (stdin);
+ _newlib_flockfile_exit (fp);
return NULL;
}
else
@@ -93,7 +97,7 @@ _DEFUN(_gets_r, (ptr, buf),
else
*s++ = c;
*s = 0;
- _newlib_flockfile_end (stdin);
+ _newlib_flockfile_end (fp);
return buf;
}
diff --git a/newlib/libc/stdio/puts.c b/newlib/libc/stdio/puts.c
index 4c60aaa4c..74673715f 100644
--- a/newlib/libc/stdio/puts.c
+++ b/newlib/libc/stdio/puts.c
@@ -95,6 +95,7 @@ _DEFUN(_puts_r, (ptr, s),
_REENT_SMALL_CHECK_INIT (ptr);
fp = _stdout_r (ptr);
+ CHECK_INIT (ptr, fp);
_newlib_flockfile_start (fp);
ORIENT (fp, -1);
result = (__sfvwrite_r (ptr, fp, &uio) ? EOF : '\n');
@@ -107,6 +108,7 @@ _DEFUN(_puts_r, (ptr, s),
_REENT_SMALL_CHECK_INIT (ptr);
fp = _stdout_r (ptr);
+ CHECK_INIT (ptr, fp);
_newlib_flockfile_start (fp);
ORIENT (fp, -1);
/* Make sure we can write. */