diff options
author | Shoichi Sakon <s-sakon@ap.jp.nec.com> | 2015-08-03 21:51:16 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2015-08-03 21:51:35 +0200 |
commit | 001ef5af395d6e940a9a6ea10d9f03dcef13536e (patch) | |
tree | 9e84326ccfe0f2e2b31fd296c071433f76c0e673 /newlib/libc/stdio | |
parent | 09d458b5c7316cc6ccf3a9a153b94d09b0119305 (diff) | |
download | cygnal-001ef5af395d6e940a9a6ea10d9f03dcef13536e.tar.gz cygnal-001ef5af395d6e940a9a6ea10d9f03dcef13536e.tar.bz2 cygnal-001ef5af395d6e940a9a6ea10d9f03dcef13536e.zip |
Fix wscanf family positional parameter handling in %lc, %ls, %l[]
* libc/stdio/vfwscanf.c (__SVFWSCANF_R): Convert wrong usage of va_arg
to GET_ARG in %lc, %ls nad %l[] cases. Fix unterminated string in %l[]
case.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'newlib/libc/stdio')
-rw-r--r-- | newlib/libc/stdio/vfwscanf.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/newlib/libc/stdio/vfwscanf.c b/newlib/libc/stdio/vfwscanf.c index 263d8f23d..38a060d28 100644 --- a/newlib/libc/stdio/vfwscanf.c +++ b/newlib/libc/stdio/vfwscanf.c @@ -777,7 +777,7 @@ _DEFUN(__SVFWSCANF_R, (rptr, fp, fmt0, ap), if (flags & LONG) { if (!(flags & SUPPRESS)) - p = va_arg(ap, wchar_t *); + p = GET_ARG(N, ap, wchar_t *); n = 0; while (width-- != 0 && (wi = _fgetwc_r (rptr, fp)) != WEOF) { @@ -794,7 +794,7 @@ _DEFUN(__SVFWSCANF_R, (rptr, fp, fmt0, ap), else { if (!(flags & SUPPRESS)) - mbp = va_arg(ap, char *); + mbp = GET_ARG(N, ap, char *); n = 0; memset ((_PTR)&mbs, '\0', sizeof (mbstate_t)); while (width != 0 && (wi = _fgetwc_r (rptr, fp)) != WEOF) @@ -849,7 +849,7 @@ _DEFUN(__SVFWSCANF_R, (rptr, fp, fmt0, ap), } else if (flags & LONG) { - p0 = p = va_arg(ap, wchar_t *); + p0 = p = GET_ARG(N, ap, wchar_t *); while ((wi = _fgetwc_r (rptr, fp)) != WEOF && width-- != 0 && INCCL (wi)) *p++ = (wchar_t) wi; @@ -858,11 +858,13 @@ _DEFUN(__SVFWSCANF_R, (rptr, fp, fmt0, ap), n = p - p0; if (n == 0) goto match_failure; + *p = L'\0'; + nassigned++; } else { if (!(flags & SUPPRESS)) - mbp = va_arg(ap, char *); + mbp = GET_ARG(N, ap, char *); n = 0; memset ((_PTR) &mbs, '\0', sizeof (mbstate_t)); while ((wi = _fgetwc_r (rptr, fp)) != WEOF @@ -914,7 +916,7 @@ _DEFUN(__SVFWSCANF_R, (rptr, fp, fmt0, ap), } else if (flags & LONG) { - p0 = p = va_arg(ap, wchar_t *); + p0 = p = GET_ARG(N, ap, wchar_t *); while ((wi = _fgetwc_r (rptr, fp)) != WEOF && width-- != 0 && !iswspace (wi)) { @@ -923,13 +925,13 @@ _DEFUN(__SVFWSCANF_R, (rptr, fp, fmt0, ap), } if (wi != WEOF) _ungetwc_r (rptr, wi, fp); - *p = '\0'; + *p = L'\0'; nassigned++; } else { if (!(flags & SUPPRESS)) - mbp = va_arg(ap, char *); + mbp = GET_ARG(N, ap, char *); memset ((_PTR) &mbs, '\0', sizeof (mbstate_t)); while ((wi = _fgetwc_r (rptr, fp)) != WEOF && width != 0 && !iswspace (wi)) |