diff options
author | Joseph Myers <joseph@codesourcery.com> | 2014-11-12 22:39:36 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2014-11-12 22:39:36 +0000 |
commit | c4eae75271734f820a7477dbce33f8752af6f003 (patch) | |
tree | c909cac6bbda2c97e0003221ecd656cc668deb11 | |
parent | 01cad84e1996a6f20bf19609d0554c73f2ee33d5 (diff) | |
download | glibc-c4eae75271734f820a7477dbce33f8752af6f003.zip glibc-c4eae75271734f820a7477dbce33f8752af6f003.tar.gz glibc-c4eae75271734f820a7477dbce33f8752af6f003.tar.bz2 |
Fix __get_nprocs fgets_unlocked namespace (bug 17582).
__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.
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | include/stdio.h | 2 | ||||
-rw-r--r-- | libio/iofgets.c | 2 | ||||
-rw-r--r-- | libio/iofgets_u.c | 6 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/getsysstats.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/getsysstats.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/getsysstats.c | 2 |
8 files changed, 28 insertions, 6 deletions
@@ -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. @@ -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. diff --git a/include/stdio.h b/include/stdio.h index f6c0a77..1c54fc4 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -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) diff --git a/libio/iofgets.c b/libio/iofgets.c index 1b708ca..e352d09 100644 --- a/libio/iofgets.c +++ b/libio/iofgets.c @@ -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 diff --git a/libio/iofgets_u.c b/libio/iofgets_u.c index b2d4d8f..d338ee0 100644 --- a/libio/iofgets_u.c +++ b/libio/iofgets_u.c @@ -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) diff --git a/sysdeps/unix/sysv/linux/alpha/getsysstats.c b/sysdeps/unix/sysv/linux/alpha/getsysstats.c index 0b39d89..bc4abfe 100644 --- a/sysdeps/unix/sysv/linux/alpha/getsysstats.c +++ b/sysdeps/unix/sysv/linux/alpha/getsysstats.c @@ -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; \ diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c index 1746827..5b277e4 100644 --- a/sysdeps/unix/sysv/linux/getsysstats.c +++ b/sysdeps/unix/sysv/linux/getsysstats.c @@ -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); diff --git a/sysdeps/unix/sysv/linux/sparc/getsysstats.c b/sysdeps/unix/sysv/linux/sparc/getsysstats.c index 8ec0a92..f28714c 100644 --- a/sysdeps/unix/sysv/linux/sparc/getsysstats.c +++ b/sysdeps/unix/sysv/linux/sparc/getsysstats.c @@ -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; \ } \ |