From: Ulrich Drepper Date: Tue, 17 Aug 1999 01:08:31 +0000 (+0000) Subject: (process_arg): Correct %ls handling wrt to precision. X-Git-Tag: cvs/glibc_2-1-2~138 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c608b3cd868a7f17cb532ace38c13d9124e8b98d;p=thirdparty%2Fglibc.git (process_arg): Correct %ls handling wrt to precision. --- diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 15a4e219df8..bc66393a366 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -915,20 +915,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); \ - (void) __wcsrtombs (string, &s2, len + 1, &mbstate); \ - if (prec < len) \ - len = prec; \ } \ \ if ((width -= len) < 0) \