This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix ttyslot namespace (bug 18547)


ttyslot (XPG4) calls the non-XPG4 functions endttyent, getttyent and
setttyent, which in turn bring in references to fgets_unlocked and
getttynam.  This patch fixes this by making these functions into weak
aliases and calling the __* names as needed.

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

2015-06-16  Joseph Myers  <joseph@codesourcery.com>

	[BZ #18547]
	* misc/getttyent.c (getttynam): Rename to __getttynam and define
	as weak alias of __getttynam.  Use prototype function definition.
	Call __setttyent, __getttyent and __endttyent instead of
	setttyent, getttyent and endttyent.
	(getttyent): Rename to __getttyent and define as weak alias of
	__getttyent.  Call __setttyent instead of setttyent.  Call
	__fgets_unlocked instead of fgets_unlocked.
	(setttyent): Rename to __setttyent and define as weak alias of
	__setttyent.
	(endttyent): Rename to __endttyent and define as weak alias of
	__endttyent.
	* include/ttyent.h (__getttyent): Declare.  Use libc_hidden_proto.
	(__setttyent): Likewise.
	(__endttyent): Likewise.
	(getttyent): Don't use libc_hidden_proto.
	(setttyent): Likewise.
	(endttyent): Likewise.
	* misc/ttyslot.c (ttyslot): Call __setttyent, __getttyent and
	__endttyent instead of setttyent, getttyent and endttyent.
	* conform/Makefile (test-xfail-XPG4/unistd.h/linknamespace):
	Remove variable.

diff --git a/conform/Makefile b/conform/Makefile
index 52df51e..ad9cc69 100644
--- a/conform/Makefile
+++ b/conform/Makefile
@@ -345,4 +345,3 @@ test-xfail-XOPEN2K8/ndbm.h/linknamespace = yes
 
 # Unsorted expected failures.
 test-xfail-XPG3/unistd.h/linknamespace = yes
-test-xfail-XPG4/unistd.h/linknamespace = yes
diff --git a/include/ttyent.h b/include/ttyent.h
index e510df8..81e5211 100644
--- a/include/ttyent.h
+++ b/include/ttyent.h
@@ -1,8 +1,11 @@
 #ifndef	_TTYENT_H
 # include <misc/ttyent.h>
 
-libc_hidden_proto (getttyent)
-libc_hidden_proto (setttyent)
-libc_hidden_proto (endttyent)
+extern __typeof (getttyent) __getttyent __THROW;
+libc_hidden_proto (__getttyent)
+extern __typeof (setttyent) __setttyent __THROW;
+libc_hidden_proto (__setttyent)
+extern __typeof (endttyent) __endttyent __THROW;
+libc_hidden_proto (__endttyent)
 
 #endif
diff --git a/misc/getttyent.c b/misc/getttyent.c
index 864f65f..fcdbc22 100644
--- a/misc/getttyent.c
+++ b/misc/getttyent.c
@@ -44,24 +44,24 @@ static char zapchar;
 static FILE *tf;
 
 struct ttyent *
-getttynam(tty)
-	const char *tty;
+__getttynam (const char *tty)
 {
 	struct ttyent *t;
 
-	setttyent();
-	while ((t = getttyent()))
+	__setttyent();
+	while ((t = __getttyent()))
 		if (!strcmp(tty, t->ty_name))
 			break;
-	endttyent();
+	__endttyent();
 	return (t);
 }
+weak_alias (__getttynam, getttynam)
 
 static char *skip (char *) __THROW internal_function;
 static char *value (char *) __THROW internal_function;
 
 struct ttyent *
-getttyent (void)
+__getttyent (void)
 {
 	static struct ttyent tty;
 	int c;
@@ -69,11 +69,11 @@ getttyent (void)
 #define	MAXLINELENGTH	100
 	static char line[MAXLINELENGTH];
 
-	if (!tf && !setttyent())
+	if (!tf && !__setttyent())
 		return (NULL);
 	flockfile (tf);
 	for (;;) {
-		if (!fgets_unlocked(p = line, sizeof(line), tf)) {
+		if (!__fgets_unlocked(p = line, sizeof(line), tf)) {
 			funlockfile (tf);
 			return (NULL);
 		}
@@ -131,7 +131,8 @@ getttyent (void)
 		*p = '\0';
 	return (&tty);
 }
-libc_hidden_def (getttyent)
+libc_hidden_def (__getttyent)
+weak_alias (__getttyent, getttyent)
 
 #define	QUOTED	1
 
@@ -184,7 +185,7 @@ value(p)
 }
 
 int
-setttyent (void)
+__setttyent (void)
 {
 
 	if (tf) {
@@ -197,10 +198,11 @@ setttyent (void)
 	}
 	return (0);
 }
-libc_hidden_def (setttyent)
+libc_hidden_def (__setttyent)
+weak_alias (__setttyent, setttyent)
 
 int
-endttyent (void)
+__endttyent (void)
 {
 	int rval;
 
@@ -211,4 +213,5 @@ endttyent (void)
 	}
 	return (1);
 }
-libc_hidden_def (endttyent)
+libc_hidden_def (__endttyent)
+weak_alias (__endttyent, endttyent)
diff --git a/misc/ttyslot.c b/misc/ttyslot.c
index 9c69589..0ed14d7 100644
--- a/misc/ttyslot.c
+++ b/misc/ttyslot.c
@@ -53,20 +53,20 @@ ttyslot (void)
 
 	name = __alloca (buflen);
 
-	setttyent();
+	__setttyent();
 	for (cnt = 0; cnt < 3; ++cnt)
 		if (__ttyname_r (cnt, name, buflen) == 0) {
 			if ((p = rindex(name, '/')))
 				++p;
 			else
 				p = name;
-			for (slot = 1; (ttyp = getttyent()); ++slot)
+			for (slot = 1; (ttyp = __getttyent()); ++slot)
 				if (!strcmp(ttyp->ty_name, p)) {
-					endttyent();
+					__endttyent();
 					return(slot);
 				}
 			break;
 		}
-	endttyent();
+	__endttyent();
 	return(0);
 }

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]