summaryrefslogtreecommitdiff
path: root/stdio-common
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-08-17 01:06:30 +0000
committerUlrich Drepper <drepper@redhat.com>1999-08-17 01:06:30 +0000
commit22318b7b137c63cb1512f286d3c2a2a42cec561f (patch)
treea9756d50d5f49742bf5a4c9f5ca7c5f3ba045729 /stdio-common
parentc9ade7e27fe7aa505cab2935b424d2187c38b8b8 (diff)
Update.
* stdio-common/vfprintf.c (process_string_arg) [printf]: Handle possibly unterminated strings for %ls when a precision is specified. Patch by Akira YOSHIYAMA <yosshy@tkf.att.ne.jp>.
Diffstat (limited to 'stdio-common')
-rw-r--r--stdio-common/vfprintf.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index d140426297..780ac76c0d 100644
--- a/stdio-common/vfprintf.c
+++ b/stdio-common/vfprintf.c
@@ -1105,21 +1105,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); \
- if (prec > 0 && prec < len) \
- len = __wcsrtombs (string, &s2, prec, &mbstate); \
- else \
- (void) __wcsrtombs (string, &s2, len + 1, &mbstate); \
} \
\
if ((width -= len) < 0) \