1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

Fix two printf handler issues.

This commit is contained in:
Jakub Jelinek
2011-02-15 13:51:48 -05:00
committed by Ulrich Drepper
parent edf9294e7a
commit c1d0e639a9
3 changed files with 21 additions and 7 deletions

View File

@ -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> 2011-02-03 Andreas Schwab <schwab@redhat.com>
* sysdeps/unix/sysv/linux/sparc/bits/socket.h: Sync with * sysdeps/unix/sysv/linux/sparc/bits/socket.h: Sync with

View File

@ -30,8 +30,8 @@ _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr, CHAR_T *end)
# define decimal NULL # define decimal NULL
# define thousands NULL # define thousands NULL
#else #else
char decimal[MB_LEN_MAX]; char decimal[MB_LEN_MAX + 1];
char thousands[MB_LEN_MAX]; char thousands[MB_LEN_MAX + 1];
#endif #endif
/* "to_outpunct" is a map from ASCII decimal point and thousands-sep /* "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; mbstate_t state;
memset (&state, '\0', sizeof (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); memcpy (decimal, ".", 2);
else
decimal[n] = '\0';
memset (&state, '\0', sizeof (state)); 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); memcpy (thousands, ",", 2);
else
thousands[n] = '\0';
} }
#endif #endif

View 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 /* 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 uses more than one. The normal case is covered though. If
the call returns -1 we continue with the normal specifiers. */ the call returns -1 we continue with the normal specifiers. */
|| (spec->ndata_args = (*__printf_arginfo_table[spec->info.spec]) || (int) (spec->ndata_args = (*__printf_arginfo_table[spec->info.spec])
(&spec->info, 1, &spec->data_arg_type, (&spec->info, 1, &spec->data_arg_type,
&spec->size)) < 0) &spec->size)) < 0)
{ {
/* Find the data argument types of a built-in spec. */ /* Find the data argument types of a built-in spec. */
spec->ndata_args = 1; spec->ndata_args = 1;