The following commit has been merged in the master branch:
commit bd5fec232c02cdc0897685d46c9a6f99943d055b
Author: Russ Allbery <[email protected]>
Date: Sat Jul 4 21:07:44 2009 -0700
Avoid a false positive in the bashism check for trap
* checks/scripts{,.desc}:
+ [RA] Avoid a false positive in the bashism check for trap with
signal numbers when the the trap command contains a number. Thanks,
Julien Cristau. (Closes: #534580)
Also create a new scripts-bashisms check in the new test suite that
includes all the bashism checks from the old maintainer-scripts check.
diff --git a/checks/scripts b/checks/scripts
index 2cc2e70..1da05ad 100644
--- a/checks/scripts
+++ b/checks/scripts
@@ -234,7 +234,8 @@ our @bashism_regexs = (
$LEADIN . qr'read\s*(?:-\w+\s*)*(?:\".*?\"|[\'].*?[\'])?\s*(?:;|$)',
# read without variable
$LEADIN . qr'kill\s+-[^sl]\w*',# kill -[0-9] or -[A-Z]
- $LEADIN . qr'trap\s+["\']?.*["\']?\s+.*[1-9]', # trap with signal numbers
+ $LEADIN .
qr'trap\s+(?:\'(?:[^\'\\]|\\.)*\'\s+|\"(?:[^\"\\]|\\.)*\"\s+)?[^\"\']*[1-9]',
+ # trap with signal numbers
qr'\&>', # cshism
qr'(<\&|>\&)\s*((-|\d+)[^\s;|)`&\\\\]|[^-\d\s]+)', # should be >word 2>&1
qr'\[\[(?!:)', # alternative test command
diff --git a/debian/changelog b/debian/changelog
index 9f2c0aa..2bda222 100755
--- a/debian/changelog
+++ b/debian/changelog
@@ -46,6 +46,9 @@ lintian (2.2.13) UNRELEASED; urgency=low
+ [ADB] Detect the use of the "source" bashism when the sourced filename
contains a tilde or consists of a single character. Thanks, Raphael
Geissert and Ryan Niebur.
+ + [RA] Avoid a false positive in the bashism check for trap with
+ signal numbers when the the trap command contains a number. Thanks,
+ Julien Cristau. (Closes: #534580)
* collection/strings:
+ [ADB] Handle the fact that, when Lintian is run as root, the output of
diff --git a/t/tests/scripts-bashisms/debian/debian/postinst
b/t/tests/scripts-bashisms/debian/debian/postinst
new file mode 100644
index 0000000..b49ed8a
--- /dev/null
+++ b/t/tests/scripts-bashisms/debian/debian/postinst
@@ -0,0 +1,87 @@
+#! /bin/sh -e
+
+# valid
+. /usr/share/lintian/shell || exit 0
+. /usr/share/lintian/shell >/dev/null
+. /usr/share/lintian/shell 2>/dev/null
+. /usr/share/lintian/shell </dev/null
+. "$(dirname $0)/shell" ; bar
+# invalid
+. /usr/share/lintian/shell foo
+. "$(dirname $0)/shell" bar
+
+print "Hit enter to continue"
+read
+
+H[0]='this is a string'
+echo ${H[0]}
+echo "Index 0's length is ${#H[0]}"
+echo "All of the array is: $...@]}"
+
+# This too is a heredoc.
+some-program > /etc/config-file <<'EOF'
+echo "All of the array is: $...@]}"
+EOF
+
+# But this isn't.
+cat '<<EOF'
+echo "All of the array is: $...@]}"
+EOF
+
+# This is a heredoc
+cat <<-EOF
+echo "All of the arry is $...@]}"
+EOF
+
+# As is this
+cat <<';'
+echo "All of the array is $...@]}"
+;
+
+# and this
+cat <<foo
+echo "All of the array is $...@]}"
+foobar
+echo $HOSTNAME
+foo
+
+# and again
+cat <<\bar
+echo "All of the array is $...@]}"
+bar
+
+# yet another
+cat <<"x++"
+echo "All of the array is $...@]}"
+x++
+
+# Recognize single quotes even if they start at the beginning of a line.
+echo not a bashism \
+'/{ptex,tex}/{amstex,plain,generic,}'
+
+# More bashisms.
+echo -e 'foo\n'
+echo "${!foo}"
+cat $(\< file)
+select foo in a b ; do echo $foo ; done
+cnt=$((cnt + 1))
+if false ; then
+ exec -l /bin/sh
+ exec -c /bin/sh
+ exec -a foo /bin/sh
+fi
+let cnt++
+if test -a /etc/default ; then
+ echo "$RANDOM|stuff"
+fi
+
+# Some comment checking
+# This should flag $RANDOM
+test $# -gt 2 && echo $RANDOM
+# But these shouldn't
+test 1=1 # echo $RANDOM
+(test 1=1)# echo $RANDOM
+test 1=1;# echo $RANDOM
+backgroundtask &#echo $RA
+
+#DEBHELPER#
diff --git a/testset/maintainer-scripts/debian/prerm
b/t/tests/scripts-bashisms/debian/debian/prerm
similarity index 81%
copy from testset/maintainer-scripts/debian/prerm
copy to t/tests/scripts-bashisms/debian/debian/prerm
index 076ecaf..84098f7 100644
--- a/testset/maintainer-scripts/debian/prerm
+++ b/t/tests/scripts-bashisms/debian/debian/prerm
@@ -1,13 +1,6 @@
#!/bin/sh
-if [ "$1" != "upgrade" ]; then
- update-alternatives --remove dummy /usr/bin/dummy-alternative
-fi
-
-if ([ "$1" = "upgrade" ] || [ "$1" = "remove" ]) && [ -L
/usr/doc/maintainer-scripts ]; the
-n
- rm -f /usr/doc/maintainer-scripts
-fi
+set -e
cat <<EOF
This is all really bad bash specific code!!!
@@ -39,8 +32,6 @@ if test -n $(echo foo | perl -pe 's/[[:space:]]//go'); then
echo 1
fi
-update-rc.d foo remove
-
# More false positives for bashism checks. None of these are errors.
echo "$line" | grep -q '{fonts/map,}/{\$progname,pdftex,dvips,}//'
echo "$line" | grep -q "${fonts},${foo}"
@@ -51,12 +42,6 @@ perl -e "print q( kill -HUP $? )"
# Still catch disallowed expansions in double-quotes, though.
echo "${line:3:1}"
-# The wrong way to run an init script (no invoke-rc.d).
-/etc/init.d/package stop
-
-# This is the only install-sgmlcatalog call that's allowed.
-install-sgmlcatalog --quiet --remove package
-
# More bashisms checks
read -x foo
@@ -168,7 +153,7 @@ foobar()
# This is a function with a bad name
)
-foobar@()
+foobar@() # foo
{
# As is this
}
@@ -180,9 +165,22 @@ read -r
read -p "Would you like to restart the service?" foo bar
read --fish
-set -e
-
source "$BAR"
source '$BAR'
source ~/bar
source a
+
+# An example from the X maintainer scripts that used to trigger the trap
+# bashism check.
+trap "message;\
+ message \"Received signal. Aborting $THIS_PACKAGE package $THIS_SCRIPT
script.\";\
+ message;\
+ exit 1" HUP INT QUIT TERM
+
+# Also allow for extended single quotes containing double quotes.
+trap 'message;
+ message "Received signal. Aborting $THIS_PACKAGE package $THIS_SCRIPT
script.";
+ message;
+ exit 1' HUP INT QUIT TERM
+
+#DEBHELPER#
diff --git a/t/tests/scripts-bashisms/desc b/t/tests/scripts-bashisms/desc
new file mode 100644
index 0000000..9bcfe06
--- /dev/null
+++ b/t/tests/scripts-bashisms/desc
@@ -0,0 +1,5 @@
+Testname: scripts-bashisms
+Sequence: 6000
+Version: 1.0
+Description: Check bashism detection
+Test-For: possible-bashism-in-maintainer-script
diff --git a/t/tests/scripts-bashisms/tags b/t/tests/scripts-bashisms/tags
new file mode 100644
index 0000000..d330f0b
--- /dev/null
+++ b/t/tests/scripts-bashisms/tags
@@ -0,0 +1,102 @@
+E: scripts-bashisms: maintainer-shell-script-fails-syntax-check prerm
+E: scripts-bashisms: read-in-maintainer-script postinst:14
+E: scripts-bashisms: read-in-maintainer-script prerm:162
+E: scripts-bashisms: read-in-maintainer-script prerm:164
+E: scripts-bashisms: read-in-maintainer-script prerm:165
+E: scripts-bashisms: read-in-maintainer-script prerm:166
+E: scripts-bashisms: read-in-maintainer-script prerm:47
+E: scripts-bashisms: read-in-maintainer-script prerm:48
+E: scripts-bashisms: read-in-maintainer-script prerm:49
+E: scripts-bashisms: read-in-maintainer-script prerm:50
+E: scripts-bashisms: read-in-maintainer-script prerm:51
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:10 '.
/usr/share/lintian/shell foo'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:11 '.
"$(dirname $0)/shell"'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:14 'read'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:16 'H[0]='
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:17
'${H[0]}'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:18
'${#H[0]}'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:19
'$...@]}'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:28
'$...@]}'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:63 'echo
-e'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:64
'${!foo}'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:66 'select
foo'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:69 '
exec -l'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:70 '
exec -c'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:71 '
exec -a'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:73 'let '
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:74 'test
-a'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:75
'$RANDOM'
+W: scripts-bashisms: possible-bashism-in-maintainer-script postinst:80
'$RANDOM'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:100 '
complete '
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:101 '
compgen '
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:102 '
declare '
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:105
'.foobar() {'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:106 '
typeset '
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:107 ' disown
'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:108 '
builtin '
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:109 ' set -B'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:110 ' alias
-p'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:111 '
unalias -a'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:116 'ulimit'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:117 'shopt'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:118 'type '
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:119 'time '
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:12 '[ "$2" ==
'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:120 'dirs'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:121 ' <(tac
a)'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:123 'pushd'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:126 'local -x'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:128 'popd'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:130 'readonly
-f'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:132 '/dev/tcp'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:134 'export
-x'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:138 'sh -D'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:139 'sh --foo'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:140 'sh +O'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:143 ' {a,b}'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:151 '
foo.bar()'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:156
'foobar@() '
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:16 'function
foo('
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:164 'read -r'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:165 'read -p'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:166 'read
--fish'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:168 'source
"$BAR"'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:169 'source
'$BAR''
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:170 'source
~/bar'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:171 'source a'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:19 '&>'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:22 'source
$FOO'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:24 'trap
"echo hi" EXIT HUP 3'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:26 '[['
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:27 ' kill
-HUP'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:43
'${line:3:1}'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:47 'read -x'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:48 'read -x'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:51 'read'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:53 'echo
"a\\b"'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:54 'echo
'a\nb''
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:56 '${UID'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:57 '$EUID'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:58 '$SHLVL'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:59 '$DIRSTACK'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:60 '$SECONDS'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:62 '$BASH_FOO'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:63
'$SHELLOPTS'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:64
'$PIPESTATUS'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:66 '<<<'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:69 'VAR+='
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:72 ' echo -n
-e'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:73 ' echo -e'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:74 ' echo
-en'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:75 ' echo
-ne'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:80 'ech.os()
{'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:82 '>&bar'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:83 '>& bar'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:87 ' echo
"abc\nxyz"'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:88 ' echo
'xyz\rabc''
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:91 ' echo -e'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:92 ' echo
-ne'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:93 ' echo -e'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:96 'foobar.()
{'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:97 ' suspend
'
+W: scripts-bashisms: possible-bashism-in-maintainer-script prerm:99 ' caller '
--
Debian package checker
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]