automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

install-sh: avoid Tru64 sh test operator precedence bug


From: Ralf Wildenhues
Subject: install-sh: avoid Tru64 sh test operator precedence bug
Date: Wed, 19 Jan 2011 21:54:20 +0100
User-agent: Mutt/1.5.20 (2010-08-04)

Another bug down, exposed by the increased coverage on master:

+ make -e test-install-sep
file== DESTDIR=/tmp/build-alphaev67-dec-osf5.1/tests/instspc-equal-install.dir/=
test -z "/=-prefix/foo" || ../install-sh -c -d 
"/tmp/build-alphaev67-dec-osf5.1/tests/instspc-equal-install.dir/=/=-prefix/foo"
../install-sh: test: argument expected
*** Exit 1

Should be fixed by the patch below (I can only test with Solaris sh
ATM).  You wouldn't think there are still shells around that mistreat
'test -z =' (autoconf.info duly documents this).  While at it, let's
also address the other known-problematic characters in install-sh.
They don't show up in the instspc*-inst.log as failures because the
other issues are not present in this shell I think.

I'll allow some time for comments before pushing to maint.

Thanks,
Ralf

    install-sh: avoid Tru64 sh `test' operator precedence issues.
    
    * lib/install-sh: Protect file names and directory components
    that consist of `=', `(', or `)'.  Move protection as early as
    possible, to avoid errors such as with Tru64 sh `test -z ='.
    * tests/instsh2.test: Extend test to cover more possibilities.
    Fixes 1.12 instspc-equal-install.test failure on Tru64/OSF 5.1.

diff --git a/lib/install-sh b/lib/install-sh
index 3f83ce9..a9244eb 100755
--- a/lib/install-sh
+++ b/lib/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2010-02-06.18; # UTC
+scriptversion=2011-01-19.21; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -156,6 +156,10 @@ while test $# -ne 0; do
     -s) stripcmd=$stripprog;;
 
     -t) dst_arg=$2
+       # Protect names problematic for `test' and other utilities.
+       case $dst_arg in
+         -* | [=\(\)!]) dst_arg=./$dst_arg;;
+       esac
        shift;;
 
     -T) no_target_directory=true;;
@@ -186,6 +190,10 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
     fi
     shift # arg
     dst_arg=$arg
+    # Protect names problematic for `test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
   done
 fi
 
@@ -232,9 +240,9 @@ fi
 
 for src
 do
-  # Protect names starting with `-'.
+  # Protect names problematic for `test' and other utilities.
   case $src in
-    -*) src=./$src;;
+    -* | [=\(\)!]) src=./$src;;
   esac
 
   if test -n "$dir_arg"; then
@@ -256,12 +264,7 @@ do
       echo "$0: no destination specified." >&2
       exit 1
     fi
-
     dst=$dst_arg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst;;
-    esac
 
     # If destination is a directory, append the input filename; won't work
     # if double slashes aren't ignored.
@@ -389,7 +392,7 @@ do
 
       case $dstdir in
        /*) prefix='/';;
-       -*) prefix='./';;
+       [-=\(\)!]*) prefix='./';;
        *)  prefix='';;
       esac
 
@@ -407,7 +410,7 @@ do
 
       for d
       do
-       test -z "$d" && continue
+       test X"$d" = X && continue
 
        prefix=$prefix$d
        if test -d "$prefix"; then
diff --git a/tests/instsh2.test b/tests/instsh2.test
index 778c1a3..927edeb 100755
--- a/tests/instsh2.test
+++ b/tests/instsh2.test
@@ -1,5 +1,6 @@
 #! /bin/sh
-# Copyright (C) 2002, 2004, 2006, 2008  Free Software Foundation, Inc.
+# Copyright (C) 2002, 2004, 2006, 2008, 2011 Free Software Foundation,
+# Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -77,9 +78,40 @@ test -f d3/y
 ./install-sh -T x d3 && Exit 1
 ./install-sh -T x d4// && Exit 1
 
-# Ensure that install-sh works with names that include spaces
+# Ensure that install-sh works with names that include spaces.
 touch 'a  b'
 mkdir 'x  y'
 ./install-sh 'a  b' 'x  y'
 test -f x\ \ y/a\ \ b
 test -f 'a  b'
+
+# Ensure we do not run into `test' operator precedence bugs with Tru64 sh.
+for c in = '(' ')' '!'; do
+  ./install-sh $c 2>stderr && { cat stderr >&2; Exit 1; }
+  cat stderr >&2
+  grep 'test: ' stderr && Exit 1
+  # Skip tests if the file system is not capable.
+  mkdir ./$c || continue
+  rmdir ./$c
+  ./install-sh -d $c/$c/$c
+  rm -rf ./$c
+  ./install-sh -d $c d5/$c/$c
+  test -d ./$c
+  test -d d5/$c/$c
+  ./install-sh x $c
+  test -f ./$c/x
+  rm -f ./$c/x
+  ./install-sh -t $c x
+  test -f ./$c/x
+  rm -rf ./$c
+  ( : > ./$c ) || continue
+  ./install-sh $c x d5/$c/$c
+  test -f d5/$c/$c/x
+  test -f d5/$c/$c/$c
+  rm -f d5/$c/$c/?
+  ./install-sh -t d5/$c/$c $c x
+  test -f d5/$c/$c/x
+  test -f d5/$c/$c/$c
+done
+
+:



reply via email to

[Prev in Thread] Current Thread [Next in Thread]