2010-01-19 Andy Koppe <andy.koppe@gmail.com>

* libc/stdio/vfscanf.c (__SVFSCANF_R): Fix handling of non-ASCII
        characters and allow invalid bytes in format string.
This commit is contained in:
Jeff Johnston 2010-01-19 23:16:45 +00:00
parent 8c72ebb7e0
commit 044cd63533
2 changed files with 20 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2010-01-19 Andy Koppe <andy.koppe@gmail.com>
* libc/stdio/vfscanf.c (__SVFSCANF_R): Fix handling of non-ASCII
characters and allow invalid bytes in format string.
2010-01-19 Corinna Vinschen <corinna@vinschen.de>
* libc/stdlib/wcstombs_r.c (_wcstombs_r): Handle invalid characters

View File

@ -459,7 +459,7 @@ _DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap),
u_long (*ccfn)CCFN_PARAMS=0; /* conversion function (strtol/strtoul) */
char ccltab[256]; /* character class table for %[...] */
char buf[BUF]; /* buffer for numeric conversions */
char *lptr; /* literal pointer */
unsigned char *lptr; /* literal pointer */
char *cp;
short *sp;
@ -501,16 +501,25 @@ _DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap),
nassigned = 0;
nread = 0;
#ifdef _MB_CAPABLE
memset (&state, 0, sizeof (state));
#endif
for (;;)
{
#ifndef _MB_CAPABLE
wc = *fmt;
#else
memset (&state, '\0', sizeof (state));
nbytes = __mbtowc (rptr, &wc, fmt, MB_CUR_MAX, __locale_charset (),
&state);
if (nbytes < 0) {
wc = 0xFFFD; /* Unicode replacement character */
nbytes = 1;
memset (&state, 0, sizeof (state));
}
#endif
fmt += nbytes;
if (wc == 0)
goto all_done;
if (nbytes == 1 && isspace (wc))
@ -839,6 +848,8 @@ _DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap),
#if !defined(_ELIX_LEVEL) || _ELIX_LEVEL >= 2
if (flags & LONG)
{
mbstate_t state;
memset (&state, 0, sizeof (mbstate_t));
if ((flags & SUPPRESS) == 0)
wcp = GET_ARG (N, ap, wchar_t *);
else
@ -851,7 +862,6 @@ _DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap),
buf[n++] = *fp->_p;
fp->_r -= 1;
fp->_p += 1;
memset ((_PTR)&state, '\0', sizeof (mbstate_t));
if ((mbslen = _mbrtowc_r (rptr, wcp, buf, n, &state))
== (size_t)-1)
goto input_failure; /* Invalid sequence */
@ -971,6 +981,8 @@ _DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap),
if (flags & LONG)
{
/* Process %S and %ls placeholders */
mbstate_t state;
memset (&state, 0, sizeof (mbstate_t));
if ((flags & SUPPRESS) == 0)
wcp = GET_ARG (N, ap, wchar_t *);
else
@ -983,7 +995,6 @@ _DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap),
buf[n++] = *fp->_p;
fp->_r -= 1;
fp->_p += 1;
memset ((_PTR)&state, '\0', sizeof (mbstate_t));
if ((mbslen = _mbrtowc_r (rptr, wcp, buf, n, &state))
== (size_t)-1)
goto input_failure;