From 45dcd79f6eb37ad4e9e6967f1d459ffc3629eb1f Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 17 Jun 2015 20:15:22 +0000 Subject: [PATCH] Fix swscanf vswscanf namespace (bug 18542). swscanf (added in C90 Amendment 1, present in UNIX98) calls vswscanf (added in C99, not in C90 Amendment 1 or UNIX98). This patch fixes this by using __vswscanf instead and making vswscanf into a weak alias. (I intend to add conform/ test support for C90 Amendment 1 - and various other standard versions supported by glibc but not yet by conform/ tests - at some point, once the results for currently tested standards are cleaner.) Tested for x86_64 and x86 (testsuite, and that installed stripped shared libraries are unchanged by the patch). [BZ #18542] * libio/iovswscanf.c (__vswscanf): Use libc_hidden_def. (vswscanf): Use ldbl_weak_alias instead of ldbl_strong_alias * include/wchar.h (__vswscanf): Declare. Use libc_hidden_proto. * libio/swscanf.c (__swscanf): Call __vswscanf instead of vswscanf. * conform/Makefile (test-xfail-UNIX98/wchar.h/linknamespace): Remove variable. --- ChangeLog | 9 +++++++++ NEWS | 2 +- conform/Makefile | 1 - include/wchar.h | 4 ++++ libio/iovswscanf.c | 3 ++- libio/swscanf.c | 2 +- 6 files changed, 17 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 046b1ae27d..ea4aeebaad 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2015-06-17 Joseph Myers + [BZ #18542] + * libio/iovswscanf.c (__vswscanf): Use libc_hidden_def. + (vswscanf): Use ldbl_weak_alias instead of ldbl_strong_alias + * include/wchar.h (__vswscanf): Declare. Use libc_hidden_proto. + * libio/swscanf.c (__swscanf): Call __vswscanf instead of + vswscanf. + * conform/Makefile (test-xfail-UNIX98/wchar.h/linknamespace): + Remove variable. + [BZ #18540] * libio/iofflush.c [!_IO_MTSAFE_IO] (__fflush_unlocked): Define as strong alias of _IO_fflush. Use libc_hidden_def. diff --git a/NEWS b/NEWS index 17a11aba16..d501b31243 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, 18540. + 18533, 18534, 18536, 18539, 18540, 18542. * 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 32d29850e2..0b061037cd 100644 --- a/conform/Makefile +++ b/conform/Makefile @@ -348,4 +348,3 @@ 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/wchar.h/linknamespace = yes diff --git a/include/wchar.h b/include/wchar.h index 449ad1d685..67d0248f00 100644 --- a/include/wchar.h +++ b/include/wchar.h @@ -197,7 +197,11 @@ extern int __isoc99_vwscanf (const wchar_t *__restrict __format, extern int __isoc99_vswscanf (const wchar_t *__restrict __s, const wchar_t *__restrict __format, __gnuc_va_list __arg) __THROW; +extern int __vswscanf (const wchar_t *__restrict __s, + const wchar_t *__restrict __format, + __gnuc_va_list __arg) __THROW; libc_hidden_proto (__isoc99_vswscanf) +libc_hidden_proto (__vswscanf) libc_hidden_proto (__isoc99_vfwscanf) /* Internal functions. */ diff --git a/libio/iovswscanf.c b/libio/iovswscanf.c index 7ee3597c52..a228641a85 100644 --- a/libio/iovswscanf.c +++ b/libio/iovswscanf.c @@ -43,5 +43,6 @@ __vswscanf (const wchar_t *string, const wchar_t *format, _IO_va_list args) ret = _IO_vfwscanf ((_IO_FILE *) &sf._sbf, format, args, NULL); return ret; } +libc_hidden_def (__vswscanf) ldbl_hidden_def (__vswscanf, vswscanf) -ldbl_strong_alias (__vswscanf, vswscanf) +ldbl_weak_alias (__vswscanf, vswscanf) diff --git a/libio/swscanf.c b/libio/swscanf.c index 9e4c256d24..397dbc554c 100644 --- a/libio/swscanf.c +++ b/libio/swscanf.c @@ -28,7 +28,7 @@ __swscanf (const wchar_t *s, const wchar_t *format, ...) int done; va_start (arg, format); - done = vswscanf (s, format, arg); + done = __vswscanf (s, format, arg); va_end (arg); return done;