Fix __get_nprocs fgets_unlocked namespace (bug 17582).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 12 Nov 2014 22:39:36 +0000 (22:39 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 12 Nov 2014 22:39:36 +0000 (22:39 +0000)
__get_nprocs is called from malloc code, but calls fgets_unlocked,
which is not an ISO C or POSIX function.  This patch fixes it to call
a new __fgets_unlocked name instead.

Note: there are various other uses of fgets_unlocked in glibc's
libraries, and I haven't yet investigated which others might also be
problematic (called directly or indirectly from standard functions)
and so need to change to use __fgets_unlocked.

Tested for x86_64 (testsuite, and that disassembly of installed shared
libraries is unchanged by the patch).

[BZ #17582]
* libio/iofgets.c [weak_alias && !_IO_MTSAFE_IO]
(__fgets_unlocked): Add alias of _IO_fgets.  Use libc_hidden_def.
* libio/iofgets_u.c (fgets_unlocked): Rename to __fgets_unlocked
and define as weak alias of __fgets_unlocked.  Use
libc_hidden_weak.
(__fgets_unlocked): Use libc_hidden_def.
* include/stdio.h (__fgets_unlocked): Declare.  Use
libc_hidden_proto.
* sysdeps/unix/sysv/linux/getsysstats.c (phys_pages_info): Use
__fgets_unlocked instead of fgets_unlocked.
* sysdeps/unix/sysv/linux/alpha/getsysstats.c
(GET_NPROCS_CONF_PARSER): Likewise.
* sysdeps/unix/sysv/linux/sparc/getsysstats.c
(GET_NPROCS_CONF_PARSER): Likewise.

ChangeLog
NEWS
include/stdio.h
libio/iofgets.c
libio/iofgets_u.c
sysdeps/unix/sysv/linux/alpha/getsysstats.c
sysdeps/unix/sysv/linux/getsysstats.c
sysdeps/unix/sysv/linux/sparc/getsysstats.c

index 56fff4c..90ea96b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
 2014-11-12  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #17582]
+       * libio/iofgets.c [weak_alias && !_IO_MTSAFE_IO]
+       (__fgets_unlocked): Add alias of _IO_fgets.  Use libc_hidden_def.
+       * libio/iofgets_u.c (fgets_unlocked): Rename to __fgets_unlocked
+       and define as weak alias of __fgets_unlocked.  Use
+       libc_hidden_weak.
+       (__fgets_unlocked): Use libc_hidden_def.
+       * include/stdio.h (__fgets_unlocked): Declare.  Use
+       libc_hidden_proto.
+       * sysdeps/unix/sysv/linux/getsysstats.c (phys_pages_info): Use
+       __fgets_unlocked instead of fgets_unlocked.
+       * sysdeps/unix/sysv/linux/alpha/getsysstats.c
+       (GET_NPROCS_CONF_PARSER): Likewise.
+       * sysdeps/unix/sysv/linux/sparc/getsysstats.c
+       (GET_NPROCS_CONF_PARSER): Likewise.
+
        [BZ #17574]
        * wcsmbs/wmemset.c (wmemset): Rename to __wmemset and define as
        weak alias of __wmemset.  Use libc_hidden_weak.
diff --git a/NEWS b/NEWS
index 222696d..6ae72da 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,7 +11,7 @@ Version 2.21
 
   6652, 12926, 14132, 14138, 14171, 15215, 15884, 17266, 17344, 17363,
   17370, 17371, 17411, 17460, 17475, 17485, 17501, 17506, 17508, 17522,
-  17555, 17570, 17571, 17572, 17573, 17574, 17583, 17584.
+  17555, 17570, 17571, 17572, 17573, 17574, 17582, 17583, 17584.
 
 * New locales: tu_IN, bh_IN.
 \f
index f6c0a77..1c54fc4 100644 (file)
@@ -155,6 +155,8 @@ extern __typeof (fread_unlocked) __fread_unlocked;
 libc_hidden_proto (__fread_unlocked)
 libc_hidden_proto (fwrite_unlocked)
 libc_hidden_proto (fgets_unlocked)
+extern __typeof (fgets_unlocked) __fgets_unlocked;
+libc_hidden_proto (__fgets_unlocked)
 libc_hidden_proto (fputs_unlocked)
 libc_hidden_proto (fmemopen)
 libc_hidden_proto (open_memstream)
index 1b708ca..e352d09 100644 (file)
@@ -73,6 +73,8 @@ _IO_fgets (buf, n, fp)
 weak_alias (_IO_fgets, fgets)
 
 # ifndef _IO_MTSAFE_IO
+strong_alias (_IO_fgets, __fgets_unlocked)
+libc_hidden_def (__fgets_unlocked)
 weak_alias (_IO_fgets, fgets_unlocked)
 libc_hidden_weak (fgets_unlocked)
 # endif
index b2d4d8f..d338ee0 100644 (file)
@@ -28,7 +28,7 @@
 #include <stdio.h>
 
 char *
-fgets_unlocked (buf, n, fp)
+__fgets_unlocked (buf, n, fp)
      char *buf;
      int n;
      _IO_FILE *fp;
@@ -66,4 +66,6 @@ fgets_unlocked (buf, n, fp)
   fp->_IO_file_flags |= old_error;
   return result;
 }
-libc_hidden_def (fgets_unlocked)
+libc_hidden_def (__fgets_unlocked)
+weak_alias (__fgets_unlocked, fgets_unlocked)
+libc_hidden_weak (fgets_unlocked)
index 0b39d89..bc4abfe 100644 (file)
@@ -47,7 +47,7 @@
         the kernel will not generate them.  8192 bytes are really enough. \
         If there is no "CPUs ..." line then we are on a UP system.  */    \
       (RESULT) = 1;                                                       \
-      while (fgets_unlocked ((BUFFER), sizeof (BUFFER), (FP)) != NULL)    \
+      while (__fgets_unlocked ((BUFFER), sizeof (BUFFER), (FP)) != NULL)   \
        if ((sscanf (buffer, "cpus detected : %d", &(RESULT)) == 1)        \
            || (sscanf (buffer, "CPUs probed %d", &(RESULT)) == 1))        \
          break;                                                           \
index 1746827..5b277e4 100644 (file)
@@ -299,7 +299,7 @@ phys_pages_info (const char *format)
         string "processor".  We don't have to fear extremely long
         lines since the kernel will not generate them.  8192
         bytes are really enough.  */
-      while (fgets_unlocked (buffer, sizeof buffer, fp) != NULL)
+      while (__fgets_unlocked (buffer, sizeof buffer, fp) != NULL)
        if (sscanf (buffer, format, &result) == 1)
          {
            result /= (__getpagesize () / 1024);
index 8ec0a92..f28714c 100644 (file)
@@ -46,7 +46,7 @@
         probed cpus.  We don't have to fear extremely long lines since  \
         the kernel will not generate them.  8192 bytes are really       \
         enough.  */                                                     \
-      while (fgets_unlocked ((BUFFER), sizeof (BUFFER), (FP)) != NULL)  \
+      while (__fgets_unlocked ((BUFFER), sizeof (BUFFER), (FP)) != NULL) \
        if (sscanf (buffer, "ncpus probed : %d", &(RESULT)) == 1)        \
          break;                                                         \
     }                                                                   \