From 001ef5af395d6e940a9a6ea10d9f03dcef13536e Mon Sep 17 00:00:00 2001 From: Shoichi Sakon Date: Mon, 3 Aug 2015 21:51:16 +0200 Subject: 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 --- newlib/libc/stdio/vfwscanf.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'newlib/libc/stdio/vfwscanf.c') 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)) -- cgit v1.2.3