aboutsummaryrefslogtreecommitdiff
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.zip
glibc-4fdfe821e20a70670b3d03deb2abed5d8c83e51b.tar.gz
glibc-4fdfe821e20a70670b3d03deb2abed5d8c83e51b.tar.bz2
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 08ec932..55724f6 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 5a690b8..f58437b 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 5a25ecc..2e0663a 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 f7e5f61..c4ff833 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); \
} \
} \