This is the mail archive of the newlib-cvs@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] Fix wscanf family positional parameter handling in %lc, %ls, %l[]


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=001ef5af395d6e940a9a6ea10d9f03dcef13536e

commit 001ef5af395d6e940a9a6ea10d9f03dcef13536e
Author: Shoichi Sakon <s-sakon@ap.jp.nec.com>
Date:   Mon Aug 3 21:51:16 2015 +0200

    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>

Diff:
---
 newlib/ChangeLog             |  6 ++++++
 newlib/libc/stdio/vfwscanf.c | 16 +++++++++-------
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index 6d84d71..6500651 100644
--- a/newlib/ChangeLog
+++ b/newlib/ChangeLog
@@ -1,3 +1,9 @@
+2015-08-03  Shoichi Sakon  <s-sakon@ap.jp.nec.com>
+
+	* 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.
+
 2015-07-30  Sebastian Huber  <sebastian.huber@embedded-brains.de>
 
 	* libc/sys/rtems/include/sys/lock.h (__LOCK_INIT_RECURSIVE): Use
diff --git a/newlib/libc/stdio/vfwscanf.c b/newlib/libc/stdio/vfwscanf.c
index 263d8f2..38a060d 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))


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]