Fix fgets_unlocked namespace issues (bug 17664).

Various POSIX functions bring in res_init.o, res_hconf.o or
mntent_r.o, which use fgets_unlocked, which is not a POSIX function.
This patch arranges for them to use __fgets_unlocked instead.  (The
IS_IN (libc) conditional in rec_hconf.c is needed because that file is
also used in nscd.)

Tested for x86_64 (testsuite, and that disassembly of installed shared
libraries is unchanged by the patch except for an assertion line
number).  Note that most of the linknamespace tests that failed
because of fgets_unlocked from the resolver also fail because of other
symbols brought in by the resolver, so the number of XFAILs this
removes is limited.  Also note that fgets_unlocked failures for
unistd.h for XPG3/XPG4 showed up that actually unistd.h is declaring
too much for XPG3/XPG4 (bug 17665) - there is no actual need to make
getusershell.c use __fgets_unlocked (at least as regards formal
standards are concerned; maybe it should still change for
namespace-cleanness of _DEFAULT_SOURCE) because the functions there
aren't actually in any of the supported standards; the correct fix for
those failures will be to stop the *usershell* functions appearing in
unistd.h for XPG3/XPG4.

	[BZ #17664]
	* misc/mntent_r.c (__getmntent_r): Use __fgets_unlocked instead of
	fgets_unlocked.
	* resolv/res_hconf.c [IS_IN (libc)] (fgets_unlocked): Define to
	__fgets_unlocked.
	* resolv/res_init.c (__res_vinit): Use __fgets_unlocked instead of
	fgets_unlocked.
	* conform/Makefile (test-xfail-XPG4/sys/statvfs.h/linknamespace):
	Remove variable.
	(test-xfail-POSIX/sys/mman.h/linknamespace): Likewise.
	(test-xfail-UNIX98/sys/mman.h/linknamespace): Likewise.
	(test-xfail-UNIX98/sys/statvfs.h/linknamespace): Likewise.
	(test-xfail-XOPEN2K/sys/mman.h/linknamespace): Likewise.
	(test-xfail-XOPEN2K/sys/statvfs.h/linknamespace): Likewise.
	(test-xfail-POSIX2008/sys/mman.h/linknamespace): Likewise.
	(test-xfail-POSIX2008/sys/statvfs.h/linknamespace): Likewise.
	(test-xfail-XOPEN2K8/sys/mman.h/linknamespace): Likewise.
	(test-xfail-XOPEN2K8/sys/statvfs.h/linknamespace): Likewise.
This commit is contained in:
Joseph Myers 2014-12-02 21:31:24 +00:00
parent 66cadc058d
commit 84e5e75640
6 changed files with 27 additions and 14 deletions

View File

@ -1,5 +1,24 @@
2014-12-02 Joseph Myers <joseph@codesourcery.com> 2014-12-02 Joseph Myers <joseph@codesourcery.com>
[BZ #17664]
* misc/mntent_r.c (__getmntent_r): Use __fgets_unlocked instead of
fgets_unlocked.
* resolv/res_hconf.c [IS_IN (libc)] (fgets_unlocked): Define to
__fgets_unlocked.
* resolv/res_init.c (__res_vinit): Use __fgets_unlocked instead of
fgets_unlocked.
* conform/Makefile (test-xfail-XPG4/sys/statvfs.h/linknamespace):
Remove variable.
(test-xfail-POSIX/sys/mman.h/linknamespace): Likewise.
(test-xfail-UNIX98/sys/mman.h/linknamespace): Likewise.
(test-xfail-UNIX98/sys/statvfs.h/linknamespace): Likewise.
(test-xfail-XOPEN2K/sys/mman.h/linknamespace): Likewise.
(test-xfail-XOPEN2K/sys/statvfs.h/linknamespace): Likewise.
(test-xfail-POSIX2008/sys/mman.h/linknamespace): Likewise.
(test-xfail-POSIX2008/sys/statvfs.h/linknamespace): Likewise.
(test-xfail-XOPEN2K8/sys/mman.h/linknamespace): Likewise.
(test-xfail-XOPEN2K8/sys/statvfs.h/linknamespace): Likewise.
* elf/tst-unique4lib.cc (b): Mark with __attribute__ ((used)). * elf/tst-unique4lib.cc (b): Mark with __attribute__ ((used)).
2014-12-02 Adhemerval Zanella <azanella@linux.vnet.ibm.com> 2014-12-02 Adhemerval Zanella <azanella@linux.vnet.ibm.com>

2
NEWS
View File

@ -13,7 +13,7 @@ Version 2.21
16619, 16740, 16857, 17192, 17266, 17344, 17363, 17370, 17371, 17411, 16619, 16740, 16857, 17192, 17266, 17344, 17363, 17370, 17371, 17411,
17460, 17475, 17485, 17501, 17506, 17508, 17522, 17555, 17570, 17571, 17460, 17475, 17485, 17501, 17506, 17508, 17522, 17555, 17570, 17571,
17572, 17573, 17574, 17581, 17582, 17583, 17584, 17585, 17589, 17594, 17572, 17573, 17574, 17581, 17582, 17583, 17584, 17585, 17589, 17594,
17608, 17616, 17625, 17633. 17608, 17616, 17625, 17633, 17664.
* CVE-2104-7817 The wordexp function could ignore the WRDE_NOCMD flag * CVE-2104-7817 The wordexp function could ignore the WRDE_NOCMD flag
under certain input conditions resulting in the execution of a shell for under certain input conditions resulting in the execution of a shell for

View File

@ -369,7 +369,6 @@ test-xfail-XPG4/regex.h/linknamespace = yes
test-xfail-XPG4/search.h/linknamespace = yes test-xfail-XPG4/search.h/linknamespace = yes
test-xfail-XPG4/stdio.h/linknamespace = yes test-xfail-XPG4/stdio.h/linknamespace = yes
test-xfail-XPG4/stdlib.h/linknamespace = yes test-xfail-XPG4/stdlib.h/linknamespace = yes
test-xfail-XPG4/sys/statvfs.h/linknamespace = yes
test-xfail-XPG4/syslog.h/linknamespace = yes test-xfail-XPG4/syslog.h/linknamespace = yes
test-xfail-XPG4/time.h/linknamespace = yes test-xfail-XPG4/time.h/linknamespace = yes
test-xfail-XPG4/unistd.h/linknamespace = yes test-xfail-XPG4/unistd.h/linknamespace = yes
@ -382,7 +381,6 @@ test-xfail-POSIX/pthread.h/linknamespace = yes
test-xfail-POSIX/regex.h/linknamespace = yes test-xfail-POSIX/regex.h/linknamespace = yes
test-xfail-POSIX/sched.h/linknamespace = yes test-xfail-POSIX/sched.h/linknamespace = yes
test-xfail-POSIX/semaphore.h/linknamespace = yes test-xfail-POSIX/semaphore.h/linknamespace = yes
test-xfail-POSIX/sys/mman.h/linknamespace = yes
test-xfail-POSIX/time.h/linknamespace = yes test-xfail-POSIX/time.h/linknamespace = yes
test-xfail-POSIX/unistd.h/linknamespace = yes test-xfail-POSIX/unistd.h/linknamespace = yes
test-xfail-POSIX/wordexp.h/linknamespace = yes test-xfail-POSIX/wordexp.h/linknamespace = yes
@ -403,8 +401,6 @@ test-xfail-UNIX98/search.h/linknamespace = yes
test-xfail-UNIX98/semaphore.h/linknamespace = yes test-xfail-UNIX98/semaphore.h/linknamespace = yes
test-xfail-UNIX98/stdio.h/linknamespace = yes test-xfail-UNIX98/stdio.h/linknamespace = yes
test-xfail-UNIX98/stdlib.h/linknamespace = yes test-xfail-UNIX98/stdlib.h/linknamespace = yes
test-xfail-UNIX98/sys/mman.h/linknamespace = yes
test-xfail-UNIX98/sys/statvfs.h/linknamespace = yes
test-xfail-UNIX98/syslog.h/linknamespace = yes test-xfail-UNIX98/syslog.h/linknamespace = yes
test-xfail-UNIX98/time.h/linknamespace = yes test-xfail-UNIX98/time.h/linknamespace = yes
test-xfail-UNIX98/unistd.h/linknamespace = yes test-xfail-UNIX98/unistd.h/linknamespace = yes
@ -428,8 +424,6 @@ test-xfail-XOPEN2K/semaphore.h/linknamespace = yes
test-xfail-XOPEN2K/signal.h/linknamespace = yes test-xfail-XOPEN2K/signal.h/linknamespace = yes
test-xfail-XOPEN2K/spawn.h/linknamespace = yes test-xfail-XOPEN2K/spawn.h/linknamespace = yes
test-xfail-XOPEN2K/stdlib.h/linknamespace = yes test-xfail-XOPEN2K/stdlib.h/linknamespace = yes
test-xfail-XOPEN2K/sys/mman.h/linknamespace = yes
test-xfail-XOPEN2K/sys/statvfs.h/linknamespace = yes
test-xfail-XOPEN2K/sys/wait.h/linknamespace = yes test-xfail-XOPEN2K/sys/wait.h/linknamespace = yes
test-xfail-XOPEN2K/syslog.h/linknamespace = yes test-xfail-XOPEN2K/syslog.h/linknamespace = yes
test-xfail-XOPEN2K/time.h/linknamespace = yes test-xfail-XOPEN2K/time.h/linknamespace = yes
@ -448,8 +442,6 @@ test-xfail-POSIX2008/pthread.h/linknamespace = yes
test-xfail-POSIX2008/regex.h/linknamespace = yes test-xfail-POSIX2008/regex.h/linknamespace = yes
test-xfail-POSIX2008/semaphore.h/linknamespace = yes test-xfail-POSIX2008/semaphore.h/linknamespace = yes
test-xfail-POSIX2008/spawn.h/linknamespace = yes test-xfail-POSIX2008/spawn.h/linknamespace = yes
test-xfail-POSIX2008/sys/mman.h/linknamespace = yes
test-xfail-POSIX2008/sys/statvfs.h/linknamespace = yes
test-xfail-POSIX2008/time.h/linknamespace = yes test-xfail-POSIX2008/time.h/linknamespace = yes
test-xfail-POSIX2008/unistd.h/linknamespace = yes test-xfail-POSIX2008/unistd.h/linknamespace = yes
test-xfail-XOPEN2K8/aio.h/linknamespace = yes test-xfail-XOPEN2K8/aio.h/linknamespace = yes
@ -467,8 +459,6 @@ test-xfail-XOPEN2K8/regex.h/linknamespace = yes
test-xfail-XOPEN2K8/search.h/linknamespace = yes test-xfail-XOPEN2K8/search.h/linknamespace = yes
test-xfail-XOPEN2K8/semaphore.h/linknamespace = yes test-xfail-XOPEN2K8/semaphore.h/linknamespace = yes
test-xfail-XOPEN2K8/spawn.h/linknamespace = yes test-xfail-XOPEN2K8/spawn.h/linknamespace = yes
test-xfail-XOPEN2K8/sys/mman.h/linknamespace = yes
test-xfail-XOPEN2K8/sys/statvfs.h/linknamespace = yes
test-xfail-XOPEN2K8/syslog.h/linknamespace = yes test-xfail-XOPEN2K8/syslog.h/linknamespace = yes
test-xfail-XOPEN2K8/time.h/linknamespace = yes test-xfail-XOPEN2K8/time.h/linknamespace = yes
test-xfail-XOPEN2K8/unistd.h/linknamespace = yes test-xfail-XOPEN2K8/unistd.h/linknamespace = yes

View File

@ -127,7 +127,7 @@ __getmntent_r (FILE *stream, struct mntent *mp, char *buffer, int bufsiz)
{ {
char *end_ptr; char *end_ptr;
if (fgets_unlocked (buffer, bufsiz, stream) == NULL) if (__fgets_unlocked (buffer, bufsiz, stream) == NULL)
{ {
funlockfile (stream); funlockfile (stream);
return NULL; return NULL;
@ -140,7 +140,7 @@ __getmntent_r (FILE *stream, struct mntent *mp, char *buffer, int bufsiz)
{ {
/* Not the whole line was read. Do it now but forget it. */ /* Not the whole line was read. Do it now but forget it. */
char tmp[1024]; char tmp[1024];
while (fgets_unlocked (tmp, sizeof tmp, stream) != NULL) while (__fgets_unlocked (tmp, sizeof tmp, stream) != NULL)
if (strchr (tmp, '\n') != NULL) if (strchr (tmp, '\n') != NULL)
break; break;
} }

View File

@ -46,6 +46,10 @@
#include "res_hconf.h" #include "res_hconf.h"
#include <wchar.h> #include <wchar.h>
#if IS_IN (libc)
# define fgets_unlocked __fgets_unlocked
#endif
#define _PATH_HOSTCONF "/etc/host.conf" #define _PATH_HOSTCONF "/etc/host.conf"
/* Environment vars that all user to override default behavior: */ /* Environment vars that all user to override default behavior: */

View File

@ -238,7 +238,7 @@ __res_vinit(res_state statp, int preinit) {
/* No threads use this stream. */ /* No threads use this stream. */
__fsetlocking (fp, FSETLOCKING_BYCALLER); __fsetlocking (fp, FSETLOCKING_BYCALLER);
/* read the config file */ /* read the config file */
while (fgets_unlocked(buf, sizeof(buf), fp) != NULL) { while (__fgets_unlocked(buf, sizeof(buf), fp) != NULL) {
/* skip comments */ /* skip comments */
if (*buf == ';' || *buf == '#') if (*buf == ';' || *buf == '#')
continue; continue;