Author: jilles
Date: Thu Aug 20 22:05:55 2015
New Revision: 286973
URL: https://svnweb.freebsd.org/changeset/base/286973

Log:
  sh: Avoid negative character values from $'\Uffffffff' etc.
  
  The negative value was not expected and generated the low 8 bits as a byte,
  which may be an invalid character encoding.
  
  The final shift in creating the negative value was undefined as well.
  
  Make the temporary variable unsigned to fix this.

Added:
  head/bin/sh/tests/parser/dollar-quote13.0   (contents, props changed)
Modified:
  head/bin/sh/parser.c
  head/bin/sh/tests/parser/Makefile

Modified: head/bin/sh/parser.c
==============================================================================
--- head/bin/sh/parser.c        Thu Aug 20 21:49:59 2015        (r286972)
+++ head/bin/sh/parser.c        Thu Aug 20 22:05:55 2015        (r286973)
@@ -1195,7 +1195,8 @@ parsebackq(char *out, struct nodelist **
 static char *
 readcstyleesc(char *out)
 {
-       int c, v, i, n;
+       int c, vc, i, n;
+       unsigned int v;
 
        c = pgetc();
        switch (c) {
@@ -1310,12 +1311,12 @@ readcstyleesc(char *out)
        default:
                  synerror("Bad escape sequence");
        }
-       v = (char)v;
+       vc = (char)v;
        /*
         * We can't handle NUL bytes.
         * POSIX says we should skip till the closing quote.
         */
-       if (v == '\0') {
+       if (vc == '\0') {
                while ((c = pgetc()) != '\'') {
                        if (c == '\\')
                                c = pgetc();
@@ -1332,9 +1333,9 @@ readcstyleesc(char *out)
                pungetc();
                return out;
        }
-       if (SQSYNTAX[v] == CCTL)
+       if (SQSYNTAX[vc] == CCTL)
                USTPUTC(CTLESC, out);
-       USTPUTC(v, out);
+       USTPUTC(vc, out);
        return out;
 }
 

Modified: head/bin/sh/tests/parser/Makefile
==============================================================================
--- head/bin/sh/tests/parser/Makefile   Thu Aug 20 21:49:59 2015        
(r286972)
+++ head/bin/sh/tests/parser/Makefile   Thu Aug 20 22:05:55 2015        
(r286973)
@@ -37,6 +37,7 @@ FILES+=               dollar-quote9.0
 FILES+=                dollar-quote10.0
 FILES+=                dollar-quote11.0
 FILES+=                dollar-quote12.0
+FILES+=                dollar-quote13.0
 FILES+=                empty-braces1.0
 FILES+=                empty-cmd1.0
 FILES+=                for1.0

Added: head/bin/sh/tests/parser/dollar-quote13.0
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/bin/sh/tests/parser/dollar-quote13.0   Thu Aug 20 22:05:55 2015        
(r286973)
@@ -0,0 +1,8 @@
+# $FreeBSD$
+
+# This Unicode escape sequence that has never been in range should either
+# fail to expand or expand to a fallback.
+
+c=$(eval printf %s \$\'\\Uffffff41\' 2>/dev/null)
+r=$(($? != 0))
+[ "$r.$c" = '1.' ] || [ "$r.$c" = '0.?' ] || [ "$r.$c" = $'0.\u2222' ]
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to