From c1d0e639a95d6d3d3f1c1f70cf97d596bd5a24ec Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 15 Feb 2011 13:51:48 -0500 Subject: [PATCH] Fix two printf handler issues. --- ChangeLog | 8 ++++++++ stdio-common/_i18n_number.h | 14 ++++++++++---- stdio-common/printf-parsemb.c | 6 +++--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2d9a1e1c12..550f22a36f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2011-02-11 Jakub Jelinek + + * 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 * sysdeps/unix/sysv/linux/sparc/bits/socket.h: Sync with diff --git a/stdio-common/_i18n_number.h b/stdio-common/_i18n_number.h index 8bb56190c6..43ed17e717 100644 --- a/stdio-common/_i18n_number.h +++ b/stdio-common/_i18n_number.h @@ -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 diff --git a/stdio-common/printf-parsemb.c b/stdio-common/printf-parsemb.c index efd1eca3a2..a67cc1a499 100644 --- a/stdio-common/printf-parsemb.c +++ b/stdio-common/printf-parsemb.c @@ -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; -- 2.43.5