summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-06-17 20:14:18 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-06-17 20:14:18 +0000
commiteb1fae6a450b3cce5a75c1ed1a734520c56a6457 (patch)
tree9cfa82af5f55596737e54409cc328a4ee03c5396
parent68f1ba4ba4b9cb4661ca3ed446d0967ca79c2a47 (diff)
downloadglibc-eb1fae6a450b3cce5a75c1ed1a734520c56a6457.tar.gz
glibc-eb1fae6a450b3cce5a75c1ed1a734520c56a6457.tar.xz
glibc-eb1fae6a450b3cce5a75c1ed1a734520c56a6457.zip
Fix getpass fflush_unlocked namespace (bug 18540).
The getpass function (XPG3 / XPG4 / UNIX98) calls fflush_unlocked (not
in any of those standards).  This patch fixes this by making
fflush_unlocked into a weak alias for __fflush_unlocked and calling
__fflush_unlocked from getpass.

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

	[BZ #18540]
	* libio/iofflush.c [!_IO_MTSAFE_IO] (__fflush_unlocked): Define as
	strong alias of _IO_fflush.  Use libc_hidden_def.
	* libio/iofflush_u.c (fflush_unlocked): Rename to
	__fflush_unlocked and define as weak alias of __fflush_unlocked.
	Use libc_hidden_weak.
	* include/stdio.h (__fflush_unlocked): Declare.  Use
	libc_hidden_proto.
	* misc/getpass.c (getpass): Call __fflush_unlocked instead of
	fflush_unlocked.
	* conform/Makefile (test-xfail-UNIX98/unistd.h/linknamespace):
	Remove variable.
-rw-r--r--ChangeLog13
-rw-r--r--NEWS2
-rw-r--r--conform/Makefile1
-rw-r--r--include/stdio.h2
-rw-r--r--libio/iofflush.c2
-rw-r--r--libio/iofflush_u.c6
-rw-r--r--misc/getpass.c2
7 files changed, 23 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 2b516b6a3f..046b1ae27d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
 2015-06-17  Joseph Myers  <joseph@codesourcery.com>
 
+	[BZ #18540]
+	* libio/iofflush.c [!_IO_MTSAFE_IO] (__fflush_unlocked): Define as
+	strong alias of _IO_fflush.  Use libc_hidden_def.
+	* libio/iofflush_u.c (fflush_unlocked): Rename to
+	__fflush_unlocked and define as weak alias of __fflush_unlocked.
+	Use libc_hidden_weak.
+	* include/stdio.h (__fflush_unlocked): Declare.  Use
+	libc_hidden_proto.
+	* misc/getpass.c (getpass): Call __fflush_unlocked instead of
+	fflush_unlocked.
+	* conform/Makefile (test-xfail-UNIX98/unistd.h/linknamespace):
+	Remove variable.
+
 	[BZ #18539]
 	* stdlib/fmtmsg.c (addseverity): Rename to __addseverity and
 	define as weak alias of __addseverity.
diff --git a/NEWS b/NEWS
index 6f3d7d81a0..17a11aba16 100644
--- a/NEWS
+++ b/NEWS
@@ -22,7 +22,7 @@ Version 2.22
   18324, 18333, 18346, 18397, 18409, 18410, 18412, 18418, 18422, 18434,
   18444, 18468, 18469, 18470, 18479, 18483, 18495, 18496, 18497, 18498,
   18507, 18512, 18519, 18520, 18522, 18527, 18528, 18529, 18530, 18532,
-  18533, 18534, 18536, 18539.
+  18533, 18534, 18536, 18539, 18540.
 
 * Cache information can be queried via sysconf() function on s390 e.g. with
   _SC_LEVEL1_ICACHE_SIZE as argument.
diff --git a/conform/Makefile b/conform/Makefile
index 4bbc1e6cc8..32d29850e2 100644
--- a/conform/Makefile
+++ b/conform/Makefile
@@ -348,5 +348,4 @@ test-xfail-XPG3/unistd.h/linknamespace = yes
 test-xfail-XPG4/unistd.h/linknamespace = yes
 test-xfail-POSIX/mqueue.h/linknamespace = yes
 test-xfail-UNIX98/mqueue.h/linknamespace = yes
-test-xfail-UNIX98/unistd.h/linknamespace = yes
 test-xfail-UNIX98/wchar.h/linknamespace = yes
diff --git a/include/stdio.h b/include/stdio.h
index 9cd324bfe0..5e50e63b70 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -155,6 +155,8 @@ extern __typeof (ftello) __ftello;
 libc_hidden_proto (__ftello)
 libc_hidden_proto (fflush)
 libc_hidden_proto (fflush_unlocked)
+extern __typeof (fflush_unlocked) __fflush_unlocked;
+libc_hidden_proto (__fflush_unlocked)
 extern __typeof (fread_unlocked) __fread_unlocked;
 libc_hidden_proto (__fread_unlocked)
 libc_hidden_proto (fwrite_unlocked)
diff --git a/libio/iofflush.c b/libio/iofflush.c
index 106f55fd2c..236e145a91 100644
--- a/libio/iofflush.c
+++ b/libio/iofflush.c
@@ -50,6 +50,8 @@ weak_alias (_IO_fflush, fflush)
 libc_hidden_weak (fflush)
 
 #ifndef _IO_MTSAFE_IO
+strong_alias (_IO_fflush, __fflush_unlocked)
+libc_hidden_def (__fflush_unlocked)
 weak_alias (_IO_fflush, fflush_unlocked)
 libc_hidden_weak (fflush_unlocked)
 #endif
diff --git a/libio/iofflush_u.c b/libio/iofflush_u.c
index 6cc325a5b3..e00447991d 100644
--- a/libio/iofflush_u.c
+++ b/libio/iofflush_u.c
@@ -28,7 +28,7 @@
 #include <stdio.h>
 
 int
-fflush_unlocked (fp)
+__fflush_unlocked (fp)
      _IO_FILE *fp;
 {
   if (fp == NULL)
@@ -39,4 +39,6 @@ fflush_unlocked (fp)
       return _IO_SYNC (fp) ? EOF : 0;
     }
 }
-libc_hidden_def (fflush_unlocked)
+libc_hidden_def (__fflush_unlocked)
+weak_alias (__fflush_unlocked, fflush_unlocked)
+libc_hidden_weak (fflush_unlocked)
diff --git a/misc/getpass.c b/misc/getpass.c
index 36796db0c8..dcaff3855c 100644
--- a/misc/getpass.c
+++ b/misc/getpass.c
@@ -91,7 +91,7 @@ getpass (prompt)
 
   /* Write the prompt.  */
   __fxprintf (out, "%s", prompt);
-  fflush_unlocked (out);
+  __fflush_unlocked (out);
 
   /* Read the password.  */
   nread = __getline (&buf, &bufsize, in);