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))
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to