svn commit: r286973 - in head/bin/sh: . tests/parser

Jilles Tjoelker jilles at FreeBSD.org
Thu Aug 20 22:05:57 UTC 2015


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' ]


More information about the svn-src-head mailing list