about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@linux-m68k.org>2014-05-01 15:50:27 +0200
committerAndreas Schwab <schwab@linux-m68k.org>2014-05-01 20:42:08 +0200
commit4fdfe821e20a70670b3d03deb2abed5d8c83e51b (patch)
tree14b65b10a6c9a96452405137ec1bce22424cb204
parent0cdddc25a47509262a9a55a343395971b492b0fa (diff)
downloadglibc-4fdfe821e20a70670b3d03deb2abed5d8c83e51b.tar.gz
glibc-4fdfe821e20a70670b3d03deb2abed5d8c83e51b.tar.xz
glibc-4fdfe821e20a70670b3d03deb2abed5d8c83e51b.zip
Correctly handle %p in wprintf (BZ #16890)
-rw-r--r--ChangeLog8
-rw-r--r--NEWS2
-rw-r--r--stdio-common/tstdiomisc.c19
-rw-r--r--stdio-common/vfprintf.c3
4 files changed, 30 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 08ec932dde..55724f6fef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/NEWS b/NEWS
index 5a690b8279..f58437b03a 100644
--- a/NEWS
+++ b/NEWS
@@ -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);					      \
 	  }								      \
       }									      \