Update.
authorUlrich Drepper <drepper@redhat.com>
Tue, 17 Aug 1999 01:06:30 +0000 (01:06 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 17 Aug 1999 01:06:30 +0000 (01:06 +0000)
* stdio-common/vfprintf.c (process_string_arg) [printf]: Handle
possibly unterminated strings for %ls when a precision is
specified.
Patch by Akira YOSHIYAMA <yosshy@tkf.att.ne.jp>.

ChangeLog
stdio-common/vfprintf.c

index 344751f..4f4d6e4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 1999-08-16  Ulrich Drepper  <drepper@cygnus.com>
 
+       * stdio-common/vfprintf.c (process_string_arg) [printf]: Handle
+       possibly unterminated strings for %ls when a precision is
+       specified.
+       Patch by Akira YOSHIYAMA <yosshy@tkf.att.ne.jp>.
+
        * wcsmbs/wcsmbsload.c (__wcsmbs_clone_conv): Call
        update_conversion_ptrs.
        Reported by Shinya Hanataka <hanataka@abyss.rim.or.jp>.
index d140426..780ac76 100644 (file)
@@ -1105,21 +1105,31 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
            mbstate_t mbstate;                                                \
                                                                              \
            memset (&mbstate, '\0', sizeof (mbstate_t));                      \
-           len = __wcsrtombs (NULL, &s2, 0, &mbstate);                       \
+                                                                             \
+           if (prec > 0)                                                     \
+             {                                                               \
+               /* The string `s2' might not be NUL terminated.  */           \
+               string = (char *) alloca (prec + 1);                          \
+               len = __wcsrtombs (string, &s2, prec + 1, &mbstate);          \
+             }                                                               \
+           else                                                              \
+             {                                                               \
+               len = __wcsrtombs (NULL, &s2, 0, &mbstate);                   \
+               if (len != (size_t) -1)                                       \
+                 {                                                           \
+                   assert (__mbsinit (&mbstate));                            \
+                   s2 = (const wchar_t *) string;                            \
+                   string = (char *) alloca (len + 1);                       \
+                   (void) __wcsrtombs (string, &s2, len + 1, &mbstate);      \
+                 }                                                           \
+             }                                                               \
+                                                                             \
            if (len == (size_t) -1)                                           \
              {                                                               \
                /* Illegal wide-character string.  */                         \
                done = -1;                                                    \
                goto all_done;                                                \
              }                                                               \
-                                                                             \
-           assert (__mbsinit (&mbstate));                                    \
-           s2 = (const wchar_t *) string;                                    \
-           string = alloca (len + 1);                                        \
-           if (prec > 0 && prec < len)                                       \
-             len = __wcsrtombs (string, &s2, prec, &mbstate);                \
-           else                                                              \
-             (void) __wcsrtombs (string, &s2, len + 1, &mbstate);            \
          }                                                                   \
                                                                              \
        if ((width -= len) < 0)                                               \