diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2014-05-01 15:50:27 +0200 |
---|---|---|
committer | Andreas Schwab <schwab@linux-m68k.org> | 2014-05-01 20:42:08 +0200 |
commit | 4fdfe821e20a70670b3d03deb2abed5d8c83e51b (patch) | |
tree | 14b65b10a6c9a96452405137ec1bce22424cb204 | |
parent | 0cdddc25a47509262a9a55a343395971b492b0fa (diff) | |
download | glibc-4fdfe821e20a70670b3d03deb2abed5d8c83e51b.tar.gz |
Correctly handle %p in wprintf (BZ #16890)
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | stdio-common/tstdiomisc.c | 19 | ||||
-rw-r--r-- | stdio-common/vfprintf.c | 3 |
4 files changed, 30 insertions, 2 deletions
@@ -1,3 +1,11 @@ +2014-05-01 Andreas Schwab <schwab@linux-m68k.org> + + [BZ #16890] + * stdio-common/vfprintf.c (process_arg) [%p]: Mark string as wide + when compiling wprintf. + * stdio-common/tstdiomisc.c (t3): New function. + (main): Call it. + 2014-05-01 Steve Ellcey <sellcey@mips.com> * intl/iconv/skeleton.c (ONE_DIRECTION): Remove define. @@ -16,7 +16,7 @@ Version 2.20 16677, 16680, 16683, 16689, 16695, 16701, 16706, 16707, 16712, 16713, 16714, 16731, 16739, 16740, 16743, 16754, 16758, 16759, 16760, 16770, 16786, 16789, 16791, 16799, 16800, 16815, 16823, 16824, 16831, 16838, - 16854, 16888. + 16854, 16888, 16890. * The minimum Linux kernel version that this version of the GNU C Library can be used with is 2.6.32. diff --git a/stdio-common/tstdiomisc.c b/stdio-common/tstdiomisc.c index 5a25ecc9f0..2e0663a5e5 100644 --- a/stdio-common/tstdiomisc.c +++ b/stdio-common/tstdiomisc.c @@ -46,6 +46,24 @@ t2 (void) return result; } +static int +t3 (void) +{ + char buf[80]; + wchar_t wbuf[80]; + int result = 0; + int retval; + + retval = sprintf (buf, "%p", (char *) NULL); + result |= retval != 5 || strcmp (buf, "(nil)") != 0; + + retval = swprintf (wbuf, sizeof (wbuf) / sizeof (wbuf[0]), + L"%p", (char *) NULL); + result |= retval != 5 || wcscmp (wbuf, L"(nil)") != 0; + + return result; +} + volatile double qnanval; volatile long double lqnanval; /* A sNaN is only guaranteed to be representable in variables with static (or @@ -243,6 +261,7 @@ main (int argc, char *argv[]) result |= t1 (); result |= t2 (); + result |= t3 (); result |= F (); result |= fflush (stdout) == EOF; diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index f7e5f61cc8..c4ff8334b2 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -936,7 +936,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) /* Make sure the full string "(nil)" is printed. */ \ if (prec < 5) \ prec = 5; \ - is_long = 0; /* This is no wide-char string. */ \ + /* This is a wide string iff compiling wprintf. */ \ + is_long = sizeof (CHAR_T) > 1; \ goto LABEL (print_string); \ } \ } \ |