Fix a bug in streamout(), that could cause a buffer overrun and made msvcrt_winetest crash.

svn path=/trunk/; revision=49513
This commit is contained in:
Timo Kreuzer 2010-11-06 23:03:22 +00:00
parent 87def142b6
commit 49cee181ca

View file

@ -551,7 +551,6 @@ streamout(FILE *stream, const TCHAR *format, va_list argptr)
} }
while (val64); while (val64);
while (precision-- > 0) *--string = '0';
len = _tcslen(string); len = _tcslen(string);
break; break;
@ -563,7 +562,8 @@ streamout(FILE *stream, const TCHAR *format, va_list argptr)
/* Calculate padding */ /* Calculate padding */
prefixlen = prefix ? _tcslen(prefix) : 0; prefixlen = prefix ? _tcslen(prefix) : 0;
padding = fieldwidth - len - prefixlen; if (precision < 0) precision = 0;
padding = fieldwidth - len - prefixlen - precision;
/* Optional left space padding */ /* Optional left space padding */
if ((flags & (FLAG_ALIGN_LEFT | FLAG_PAD_ZERO)) == 0) if ((flags & (FLAG_ALIGN_LEFT | FLAG_PAD_ZERO)) == 0)
@ -584,14 +584,12 @@ streamout(FILE *stream, const TCHAR *format, va_list argptr)
} }
/* Optional left '0' padding */ /* Optional left '0' padding */
if ((flags & (FLAG_ALIGN_LEFT | FLAG_PAD_ZERO)) == FLAG_PAD_ZERO) if ((flags & FLAG_ALIGN_LEFT) == 0) precision += padding;
{ while (precision-- > 0)
while (padding-- > 0)
{ {
if ((written = streamout_char(stream, _T('0'))) == -1) return -4; if ((written = streamout_char(stream, _T('0'))) == -1) return -4;
written_all += written; written_all += written;
} }
}
/* Output the string */ /* Output the string */
if (flags & FLAG_WIDECHAR) if (flags & FLAG_WIDECHAR)