]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Don't parse %s format argument as multibyte string
authorAndreas Schwab <schwab@redhat.com>
Tue, 31 Aug 2010 10:20:05 +0000 (12:20 +0200)
committerAndreas Schwab <schwab@redhat.com>
Mon, 27 Sep 2010 13:41:56 +0000 (15:41 +0200)
ChangeLog
stdio-common/vfprintf.c

index 63a9283fc640898373cbb8e081966cd57582e6d9..5345b49a84d6051c9639e2454bad2c5b68156747 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2010-09-27  Andreas Schwab  <schwab@redhat.com>
 
+       [BZ #6530]
+       * stdio-common/vfprintf.c (process_string_arg): Revert 2000-07-22
+       change.
+
        * nss/nss_files/files-XXX.c (internal_getent): Declare linebuflen
        as size_t.
 
index 6e0e85cd7cca9f4dfc9e86fb702db131ab2e1639..bd2609eaff87da391fd2cdab3a547546cfb1beea 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-2008, 2009   Free Software Foundation, Inc.
+/* Copyright (C) 1991-2008, 2009, 2010   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -1160,41 +1160,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)     \
-                       {                                                     \
-                         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);                                          \
          }                                                                   \