Fix scandir scandirat namespace (bug 17999)

Message ID alpine.DEB.2.10.1502191531520.22905@digraph.polyomino.org.uk
State Committed
Headers

Commit Message

Joseph Myers Feb. 19, 2015, 3:32 p.m. UTC
  The POSIX function scandir calls scandirat, which is not a POSIX
function.  This patch fixes this by making it use __scandirat and
making scandirat a weak alias.  There are no changes for scandir64 /
scandirat64 because those are both _GNU_SOURCE-only functions so no
namespace issue arises for them.

Tested for x86_64 that the disassembly of installed shared libraries
is unchanged by this patch.

2015-02-19  Joseph Myers  <joseph@codesourcery.com>

	[BZ #17999]
	* dirent/scandir.c [!SCANDIR] (SCANDIRAT): Define to __scandirat
	instead of scandirat.
	* dirent/scandirat.c [!SCANDIRAT] (SCANDIRAT): Likewise.
	[!SCANDIRAT] (SCANDIRAT_WEAK_ALIAS): Define.
	[SCANDIRAT_WEAK_ALIAS] (scandirat): Define as weak alias of
	__scandirat.
	* include/dirent.h (scandirat): Do not use libc_hidden_proto.
	(__scandirat): Declare.  Use libc_hidden_proto.
	* conform/Makefile (test-xfail-POSIX2008/dirent.h/linknamespace):
	Remove variable.
	(test-xfail-XOPEN2K8/dirent.h/linknamespace): Likewise.
  

Comments

Roland McGrath Feb. 19, 2015, 4:45 p.m. UTC | #1
That is fine but I think it would be best to use the __ names in the *64
implementations too.
  

Patch

diff --git a/conform/Makefile b/conform/Makefile
index 39f41bd..3f9721a 100644
--- a/conform/Makefile
+++ b/conform/Makefile
@@ -393,13 +393,11 @@  test-xfail-XOPEN2K/syslog.h/linknamespace = yes
 test-xfail-XOPEN2K/ucontext.h/linknamespace = yes
 test-xfail-XOPEN2K/unistd.h/linknamespace = yes
 test-xfail-XOPEN2K/wordexp.h/linknamespace = yes
-test-xfail-POSIX2008/dirent.h/linknamespace = yes
 test-xfail-POSIX2008/grp.h/linknamespace = yes
 test-xfail-POSIX2008/netdb.h/linknamespace = yes
 test-xfail-POSIX2008/regex.h/linknamespace = yes
 test-xfail-POSIX2008/semaphore.h/linknamespace = yes
 test-xfail-POSIX2008/unistd.h/linknamespace = yes
-test-xfail-XOPEN2K8/dirent.h/linknamespace = yes
 test-xfail-XOPEN2K8/fmtmsg.h/linknamespace = yes
 test-xfail-XOPEN2K8/grp.h/linknamespace = yes
 test-xfail-XOPEN2K8/netdb.h/linknamespace = yes
diff --git a/dirent/scandir.c b/dirent/scandir.c
index 1039b9b..99c9681 100644
--- a/dirent/scandir.c
+++ b/dirent/scandir.c
@@ -28,7 +28,7 @@ 
 
 #ifndef SCANDIR
 # define SCANDIR scandir
-# define SCANDIRAT scandirat
+# define SCANDIRAT __scandirat
 # define DIRENT_TYPE struct dirent
 #endif
 
diff --git a/dirent/scandirat.c b/dirent/scandirat.c
index 1147cee..004b152 100644
--- a/dirent/scandirat.c
+++ b/dirent/scandirat.c
@@ -30,9 +30,10 @@ 
 #include <bits/libc-lock.h>
 
 #ifndef SCANDIRAT
-# define SCANDIRAT scandirat
+# define SCANDIRAT __scandirat
 # define READDIR __readdir
 # define DIRENT_TYPE struct dirent
+# define SCANDIRAT_WEAK_ALIAS
 #endif
 
 #ifndef SKIP_SCANDIR_CANCEL
@@ -148,6 +149,9 @@  SCANDIRAT (dfd, dir, namelist, select, cmp)
   return c.cnt;
 }
 libc_hidden_def (SCANDIRAT)
+#ifdef SCANDIRAT_WEAK_ALIAS
+weak_alias (__scandirat, scandirat)
+#endif
 
 #ifdef _DIRENT_MATCHES_DIRENT64
 weak_alias (scandirat, scandirat64)
diff --git a/include/dirent.h b/include/dirent.h
index e8e9e42..2e797ae 100644
--- a/include/dirent.h
+++ b/include/dirent.h
@@ -50,7 +50,8 @@  extern void __scandir_cancel_handler (void *arg);
 extern __typeof (rewinddir) __rewinddir;
 
 libc_hidden_proto (__rewinddir)
-libc_hidden_proto (scandirat)
+extern __typeof (scandirat) __scandirat;
+libc_hidden_proto (__scandirat)
 libc_hidden_proto (scandirat64)
 # endif