Correct mishandling of invalid characters in printf() format specs.

This commit is contained in:
Keith Marshall 2008-12-31 15:34:09 +00:00
parent 0c94c057a4
commit 762cf3ee22
2 changed files with 22 additions and 4 deletions

View File

@ -1,3 +1,13 @@
2008-12-31 Keith Marshall <keithmarshall@users.sourceforge.net>
Partial fix for MinGW-Bug [2457778]: (Reported by Sisyphus).
Correct mishandling of invalid characters in printf() format specs.
* mingwex/stdio/pformat.c (__pformat): Save `fmt' scan position in...
(backtrack): ...this new automatic variable, at start of each format
conversion specification substring; use it to backtrack, and print the
substring literally, if any invalid character is encountered.
2008-12-16 Danny Smith <dannysmith@users.sourceforge.net>
* msvcrt.def.in (___lc_codepage_func, ___lc_collate_cp_func,

View File

@ -1813,6 +1813,11 @@ int __pformat( int flags, void *dest, int max, const char *fmt, va_list argv )
__pformat_state_t state = PFORMAT_INIT;
__pformat_length_t length = PFORMAT_LENGTH_INT;
/* Save the current format scan position, so that we can backtrack
* in the event of encountering an invalid format specification...
*/
char *backtrack = fmt;
/* Restart capture for dynamic field width and precision specs...
*/
int *width_spec = &stream.width;
@ -2490,12 +2495,15 @@ int __pformat( int flags, void *dest, int max, const char *fmt, va_list argv )
}
else
{
/* We found a digit out of context, or some other character
* with no designated meaning; silently reject it, and any
* further characters other than argument length modifiers,
* until this format specification is completely resolved.
* with no designated meaning; reject this format specification,
* backtrack, and emit it as literal text...
*/
state = PFORMAT_END;
fmt = backtrack;
__pformat_putc( '%', &stream );
goto format_scan;
}
}
}
}