forked from rpms/glibc
fb633eaa14
remaining patches into distinct patchfiles. Thanks to Dmitry V. Levin for identifying them! Drop ia64 specific patches and specfile fragments
63 lines
2.5 KiB
Diff
63 lines
2.5 KiB
Diff
From 8a34866d978e4281d69104372056ba0211d1373a Mon Sep 17 00:00:00 2001
|
|
From: Andreas Schwab <schwab@redhat.com>
|
|
Date: Tue, 31 Aug 2010 12:20:05 +0200
|
|
Subject: [PATCH] Don't parse %s format argument as multibyte string
|
|
|
|
[BZ #6530]
|
|
* stdio-common/vfprintf.c (process_string_arg): Revert 2000-07-22
|
|
change.
|
|
|
|
---
|
|
ChangeLog | 4 ++++
|
|
stdio-common/vfprintf.c | 40 ++++------------------------------------
|
|
2 files changed, 8 insertions(+), 36 deletions(-)
|
|
|
|
--- a/stdio-common/vfprintf.c
|
|
+++ b/stdio-common/vfprintf.c
|
|
@@ -1168,42 +1168,9 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
|
|
else if (!is_long && spec != L_('S')) \
|
|
{ \
|
|
if (prec != -1) \
|
|
- { \
|
|
- /* Search for the end of the string, but don't search past \
|
|
- the length (in bytes) specified by the precision. Also \
|
|
- don't use incomplete characters. */ \
|
|
- if (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MB_CUR_MAX) == 1) \
|
|
- len = __strnlen (string, prec); \
|
|
- else \
|
|
- { \
|
|
- /* In case we have a multibyte character set the \
|
|
- situation is more complicated. We must not copy \
|
|
- bytes at the end which form an incomplete character. */\
|
|
- size_t ignore_size = (unsigned) prec > 1024 ? 1024 : prec;\
|
|
- wchar_t ignore[ignore_size]; \
|
|
- const char *str2 = string; \
|
|
- const char *strend = string + prec; \
|
|
- if (strend < string) \
|
|
- strend = (const char *) UINTPTR_MAX; \
|
|
- \
|
|
- mbstate_t ps; \
|
|
- memset (&ps, '\0', sizeof (ps)); \
|
|
- \
|
|
- while (str2 != NULL && str2 < strend) \
|
|
- if (__mbsnrtowcs (ignore, &str2, strend - str2, \
|
|
- ignore_size, &ps) == (size_t) -1) \
|
|
- { \
|
|
- /* Conversion function has set errno. */ \
|
|
- done = -1; \
|
|
- goto all_done; \
|
|
- } \
|
|
- \
|
|
- if (str2 == NULL) \
|
|
- len = strlen (string); \
|
|
- else \
|
|
- len = str2 - string - (ps.__count & 7); \
|
|
- } \
|
|
- } \
|
|
+ /* Search for the end of the string, but don't search past \
|
|
+ the length (in bytes) specified by the precision. */ \
|
|
+ len = __strnlen (string, prec); \
|
|
else \
|
|
len = strlen (string); \
|
|
} \
|