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:
committed by
Ulrich Drepper
parent
edf9294e7a
commit
c1d0e639a9
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user