]> sourceware.org Git - glibc.git/commitdiff
Fix two printf handler issues.
authorJakub Jelinek <jakub@redhat.com>
Tue, 15 Feb 2011 18:51:48 +0000 (13:51 -0500)
committerUlrich Drepper <drepper@gmail.com>
Tue, 15 Feb 2011 18:51:48 +0000 (13:51 -0500)
ChangeLog
stdio-common/_i18n_number.h
stdio-common/printf-parsemb.c

index 2d9a1e1c127a5d203ec92b2fb365b8a5ecd7bffc..550f22a36fdf33496e87cb69c3b9bb5154e41a39 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2011-02-11  Jakub Jelinek  <jakub@redhat.com>
+
+       * stdio-common/printf-parsemb.c (__parse_one_specmb): Handle
+       arginfo fn returning -1.
+
+       * stdio-common/_i18n_number.h (_i18n_number_rewrite): Ensure decimal
+       and thousands string is zero terminated.
+
 2011-02-03  Andreas Schwab  <schwab@redhat.com>
 
        * sysdeps/unix/sysv/linux/sparc/bits/socket.h: Sync with
index 8bb56190c61a6fde5aa1d90df4e3a92b4291a01c..43ed17e71766c1cb111ded8a0c5f8ff3288026ea 100644 (file)
@@ -30,8 +30,8 @@ _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr, CHAR_T *end)
 # define decimal NULL
 # define thousands NULL
 #else
-  char decimal[MB_LEN_MAX];
-  char thousands[MB_LEN_MAX];
+  char decimal[MB_LEN_MAX + 1];
+  char thousands[MB_LEN_MAX + 1];
 #endif
 
   /* "to_outpunct" is a map from ASCII decimal point and thousands-sep
@@ -47,13 +47,19 @@ _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr, CHAR_T *end)
       mbstate_t state;
       memset (&state, '\0', sizeof (state));
 
-      if (__wcrtomb (decimal, wdecimal, &state) == (size_t) -1)
+      size_t n = __wcrtomb (decimal, wdecimal, &state);
+      if (n == (size_t) -1)
        memcpy (decimal, ".", 2);
+      else
+       decimal[n] = '\0';
 
       memset (&state, '\0', sizeof (state));
 
-      if (__wcrtomb (thousands, wthousands, &state) == (size_t) -1)
+      n = __wcrtomb (thousands, wthousands, &state);
+      if (n == (size_t) -1)
        memcpy (thousands, ",", 2);
+      else
+       thousands[n] = '\0';
     }
 #endif
 
index efd1eca3a2259856e19ba1616d1ce0e22258a441..a67cc1a4998eb57bedb97f60026ca35b229c5568 100644 (file)
@@ -295,9 +295,9 @@ __parse_one_specmb (const UCHAR_T *format, size_t posn,
       /* We don't try to get the types for all arguments if the format
         uses more than one.  The normal case is covered though.  If
         the call returns -1 we continue with the normal specifiers.  */
-      || (spec->ndata_args = (*__printf_arginfo_table[spec->info.spec])
-         (&spec->info, 1, &spec->data_arg_type,
-          &spec->size)) < 0)
+      || (int) (spec->ndata_args = (*__printf_arginfo_table[spec->info.spec])
+                                  (&spec->info, 1, &spec->data_arg_type,
+                                   &spec->size)) < 0)
     {
       /* Find the data argument types of a built-in spec.  */
       spec->ndata_args = 1;
This page took 0.048669 seconds and 5 git commands to generate.