From: Ralf Wildenhues Date: Wed, 19 Jan 2011 20:50:02 +0000 (+0100) Subject: install-sh: avoid Tru64 sh `test' operator precedence issues. X-Git-Tag: v1.11.1b~33^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=15a6e56f4a8f9e262631419dbfc46483c0b69428;p=thirdparty%2Fautomake.git 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. Signed-off-by: Ralf Wildenhues --- diff --git a/ChangeLog b/ChangeLog index 31ff0098f..057c20628 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2011-01-19 Ralf Wildenhues + + 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. + 2011-01-19 Stefano Lattarini Ralf Wildenhues diff --git a/lib/install-sh b/lib/install-sh index 3f83ce9b5..a9244eb07 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 778c1a3e2..927edeb7e 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 + +: