Skip to content

Commit

Permalink
Fix __get_nprocs fgets_unlocked namespace (bug 17582).
Browse files Browse the repository at this point in the history
__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.
  • Loading branch information
Joseph Myers committed Nov 12, 2014
1 parent 01cad84 commit c4eae75
Show file tree
Hide file tree
Showing 8 changed files with 28 additions and 6 deletions.
16 changes: 16 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
2 changes: 1 addition & 1 deletion NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
2 changes: 2 additions & 0 deletions include/stdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions libio/iofgets.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions libio/iofgets_u.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
2 changes: 1 addition & 1 deletion sysdeps/unix/sysv/linux/alpha/getsysstats.c
Original file line number Diff line number Diff line change
Expand Up @@ -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; \
Expand Down
2 changes: 1 addition & 1 deletion sysdeps/unix/sysv/linux/getsysstats.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion sysdeps/unix/sysv/linux/sparc/getsysstats.c
Original file line number Diff line number Diff line change
Expand Up @@ -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; \
} \
Expand Down

0 comments on commit c4eae75

Please sign in to comment.