[Top][All Lists]
[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
+
+:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- install-sh: avoid Tru64 sh test operator precedence bug,
Ralf Wildenhues <=