svn commit: r273920 - in head/bin/sh: . tests/expansion

Jilles Tjoelker jilles at FreeBSD.org
Fri Oct 31 22:28:12 UTC 2014


Author: jilles
Date: Fri Oct 31 22:28:10 2014
New Revision: 273920
URL: https://svnweb.freebsd.org/changeset/base/273920

Log:
  sh: Fix corruption of CTL* bytes in positional parameters in redirection.
  
  EXP_REDIR was not being checked for while expanding positional parameters in
  redirection, so CTL* bytes were not being prefixed where they should be.
  
  MFC after:	1 week

Added:
  head/bin/sh/tests/expansion/redir1.0   (contents, props changed)
Modified:
  head/bin/sh/expand.c
  head/bin/sh/tests/expansion/Makefile

Modified: head/bin/sh/expand.c
==============================================================================
--- head/bin/sh/expand.c	Fri Oct 31 22:20:27 2014	(r273919)
+++ head/bin/sh/expand.c	Fri Oct 31 22:28:10 2014	(r273920)
@@ -862,7 +862,7 @@ varisset(const char *name, int nulok)
 static void
 strtodest(const char *p, int flag, int subtype, int quoted)
 {
-	if (flag & (EXP_FULL | EXP_CASE) && subtype != VSLENGTH)
+	if (flag & (EXP_FULL | EXP_CASE | EXP_REDIR) && subtype != VSLENGTH)
 		STPUTS_QUOTES(p, quoted ? DQSYNTAX : BASESYNTAX, expdest);
 	else
 		STPUTS(p, expdest);

Modified: head/bin/sh/tests/expansion/Makefile
==============================================================================
--- head/bin/sh/tests/expansion/Makefile	Fri Oct 31 22:20:27 2014	(r273919)
+++ head/bin/sh/tests/expansion/Makefile	Fri Oct 31 22:28:10 2014	(r273920)
@@ -72,6 +72,7 @@ FILES+=		plus-minus7.0
 FILES+=		plus-minus8.0
 FILES+=		question1.0
 FILES+=		readonly1.0
+FILES+=		redir1.0
 FILES+=		set-u1.0
 FILES+=		set-u2.0
 FILES+=		set-u3.0

Added: head/bin/sh/tests/expansion/redir1.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/bin/sh/tests/expansion/redir1.0	Fri Oct 31 22:28:10 2014	(r273920)
@@ -0,0 +1,26 @@
+# $FreeBSD$
+
+bad=0
+for i in 0 1 2 3; do
+	for j in 0 1 2 3 4 5 6 7; do
+		for k in 0 1 2 3 4 5 6 7; do
+			case $i$j$k in
+			000) continue ;;
+			esac
+			set -- "$(printf \\$i$j$k@)"
+			set -- "${1%@}"
+			ff=
+			for f in /dev/null /dev/zero /; do
+				if [ -e "$f" ] && [ ! -e "$f$1" ]; then
+					ff=$f
+				fi
+			done
+			[ -n "$ff" ] || continue
+			if { true <$ff$1; } 2>/dev/null; then
+				echo "Bad: $i$j$k ($ff)" >&2
+				: $((bad += 1))
+			fi
+		done
+	done
+done
+exit $((bad ? 2 : 0))


More information about the svn-src-head mailing list