libwine: Fix handling of null character in vsnprintfW for %c format.

oldstable
Alexandre Julliard 2011-01-13 12:41:03 +01:00
parent eb11dee4fc
commit 3812fd3006
1 changed files with 8 additions and 8 deletions

View File

@ -300,7 +300,7 @@ noconv:
/* format a WCHAR string according to a printf format; helper for vsnprintfW */ /* format a WCHAR string according to a printf format; helper for vsnprintfW */
static int format_string( WCHAR *buffer, size_t len, const char *format, const WCHAR *str ) static int format_string( WCHAR *buffer, size_t len, const char *format, const WCHAR *str, int str_len )
{ {
size_t count = 0; size_t count = 0;
int i, left_align = 0, width = 0, max = 0; int i, left_align = 0, width = 0, max = 0;
@ -316,13 +316,14 @@ static int format_string( WCHAR *buffer, size_t len, const char *format, const W
while (isdigit(*format)) width = width * 10 + *format++ - '0'; while (isdigit(*format)) width = width * 10 + *format++ - '0';
if (str_len == -1) str_len = strlenW( str );
if (*format == '.') if (*format == '.')
{ {
format++; format++;
while (isdigit(*format)) max = max * 10 + *format++ - '0'; while (isdigit(*format)) max = max * 10 + *format++ - '0';
for (i = 0; i < max; i++) if (!str[i]) max = i; if (max > str_len) max = str_len;
} }
else max = strlenW(str); else max = str_len;
if (*format == 'h' || *format == 'l') format++; if (*format == 'h' || *format == 'l') format++;
@ -425,7 +426,7 @@ int vsnprintfW(WCHAR *str, size_t len, const WCHAR *format, va_list valist)
*fmta++ = 's'; *fmta++ = 's';
*fmta = 0; *fmta = 0;
count = format_string( str, len - written, fmtbufa, wstr ? wstr : none ); count = format_string( str, len - written, fmtbufa, wstr ? wstr : none, -1 );
if (count == -1) return -1; if (count == -1) return -1;
str += count; str += count;
written += count; written += count;
@ -435,14 +436,13 @@ int vsnprintfW(WCHAR *str, size_t len, const WCHAR *format, va_list valist)
case 'c': case 'c':
{ {
WCHAR wstr[2]; WCHAR wstr;
int count; int count;
wstr[0] = va_arg(valist, int); wstr = va_arg(valist, int);
wstr[1] = 0;
*fmta++ = 's'; *fmta++ = 's';
*fmta = 0; *fmta = 0;
count = format_string( str, len - written, fmtbufa, wstr ); count = format_string( str, len - written, fmtbufa, &wstr, 1 );
if (count == -1) return -1; if (count == -1) return -1;
str += count; str += count;
written += count; written += count;