Package: devscripts
Version: 2.10.49
Severity: important
User: devscri...@packages.debian.org
Usertags: checkbashisms

Hi Adam et al,

After another archive-wide run, but now on i386 and with the latest version of 
checkbashisms, here are some other FPs I found:


-------------------

bindgraph_0.2a-4_all.deb
possible bashism in ./DEBIAN/postinst line 66 ($"foo" should be 
eval_gettext "foo"):
       if [ -z "`egrep "^\s*DNS_LOG\s*=\s*$LOGFILE\s*$" $DEFAULTS`" ]; then


possible bashism in ./usr/share/bootcd/bootcdmk2diskconf line 83 ($"foo" 
should be eval_gettext "foo"):
    j="$(echo "$RILABEL" | grep ":$i$" | awk -F: '{print $1}')"

possible bashism in ./usr/share/doc/capi4hylafax/examples/sample_faxrcvd line 
69 ($"foo" should be eval_gettext "...)
 if [ -n "`echo "$SendFile" | grep "\.tif$"`" ] ; then

possible bashism in ./usr/share/debian-cd/tools/update_tasks line 30 ($"foo" 
should be eval_gettext "foo"):
    task_primary="$(grep -Ev "^(#.*)?(.*-)?[[:space:]]*$" $tasklist)"


-------------------

gjots2_2.3.4-2.1_all.deb
possible bashism in ./usr/bin/gjots2html line 76 (brace expansion):
m4_changequote({{{{,}}}})

Caused due to incorrectly counting the number quotation marks.
Fix:
@@ -265,7 +265,7 @@ foreach my $filename (@ARGV) {
                    $templine =~ s/$otherquote.*?$quote.*?$otherquote//g;
                    # "\""
                    $templine =~ s/(^|[^\\])$quote\\$quote$quote/$1/g;
-                   my $count = () = $templine =~ /(^|[^\\])$quote/g;
+                   my $count = () = $templine =~ /(^|(?!\\))$quote/g;

                    # If there's an odd number of non-escaped
                    # quotes in the line it's almost certainly the


-------------------

> possible bashism in ./usr/bin/nws_html_hosts line 61 (should be '.', not
> 'source'):
>                       source destination | grep -v "^hostpair" | \
> possible bashism in ./usr/bin/nws_html_hosts line 64 (should be '.', not
> 'source'):
>                       source destination | grep -v "^hostpair" | \

l60:        eval $searchCommand throughput throughput_prediction 
throughput_mse \
l61:                      source destination | grep -v "^hostpair" | \
l62:        awk ' {if(NF>1) {printf "%s ", $2; if($1=="destination") 
print ""}}' > $bwFile

No idea why they are not being correctly parsed; but it isn't fixed by the 
above patch :(

-------------------

possible bashism in ./usr/src/gcc-4.1/patches/pr9861-nojava.dpatch line 112 
('function' is useless):
+#define DMGL_RET_POSTFIX (1 << 5)       /* Print function return types (when

On IRC I said it should be enough to consider #!/bin/sh /path/to/foo scripts 
as evil, but after reconsidering I don't think it is the right solution.
So far I came up with this workaround:

@@ -451,6 +451,9 @@ sub script_is_evil_and_wrong {

            $ret = $. - 1;
            last;
+       } elsif (m'@DPATCH@') {
+           $ret = $. - 1;
+           last;
        }

     }

-------------------

Misc corrections:
@@ -477,7 +480,5 @@ sub init_hashes {
        $LEADIN . qr'exec\s+-[acl]' =>    q<exec -c/-l/-a name>,
        $LEADIN . qr'let\s' =>            q<let ...>,
        qr'(?<![\$\(])\(\(.*\)\)' =>     q<'((' should be '$(('>,
-       qr'\$\[[^][]+\]' =>            q<'$[' should be '$(('>,
        qr'(?:^|\s+)(\[|test)\s+-a' =>            q<test with unary -a (should 
be -e)>,
        qr'\&>' =>                     q<should be \>word 2\>&1>,
        qr'(<\&|>\&)\s*((-|\d+)[^\s;|)`&\\\\]|[^-\d\s]+)' =>
@@ -508,14 +510,15 @@ sub init_hashes {
        $LEADIN . qr'time\s' =>          q<time>,
        $LEADIN . qr'dirs(\s|\Z)' =>          q<dirs>,
        qr'(?:^|\s+)[<>]\(.*?\)'            => q<\<() process substituion>,
-       qr'(?:^|\s+)readonly\s+-[af]' => q<readonly -[af]>,
+       $LEADIN . qr'readonly\s+-[af]' => q<readonly -[af]>,
        $LEADIN . qr'(sh|\$\{?SHELL\}?) -[rD]' => q<sh -[rD]>,
        $LEADIN . qr'(sh|\$\{?SHELL\}?) --\w+' =>  q<sh --long-option>,
        $LEADIN . qr'(sh|\$\{?SHELL\}?) [-+]O' =>  q<sh [-+]O>,
     );

     %string_bashisms = (
-       qr'\$\[\w+\]' =>                 q<arithmetic not allowed>,
+       qr'\$\[[^][]+\]' =>            q<'$[' should be '$(('>,
        qr'\$\{\w+\:\d+(?::\d+)?\}' =>   q<${foo:3[:1]}>,
        qr'\$\{!\w...@*]\}' =>           q<${!prefix[*|@]>,
        qr'\$\{!\w+\}' =>                q<${!name}>,


The "arithmetic not allowed" check was not matching all the cases, and since 
echo "$[1 + 2]" works in bash, the working check should be moved to 
string_bashisms.
And there's no reason (unless you refresh my mind :) not to use $LEADIN in 
the 'readonly' check.

-------------------

@@ -533,11 +536,11 @@ sub init_hashes {
        qr'\$\{?PIPESTATUS\}?\b'      => q<$PIPESTATUS>,
        qr'\$\{?SHLVL\}?\b'           => q<$SHLVL>,
        qr'<<<'                       => q<\<\<\< here string>,
-       $LEADIN . qr'echo\s+(?:-[^e\s]+\s+)?\"[^\"]*(\\[\\abcEfnrtv0])+.*?
[\"]' => q<unsafe echo with backslash>,
+       $LEADIN . qr'echo\s+(?:-[^e\s]+\s+)?\"[^\"]*(\\[abcEfnrtv0])+.*?[\"]' 
=> q<unsafe echo with backslash>,
     );

     %singlequote_bashisms = (
-       $LEADIN . qr'echo\s+(?:-[^e\s]+\s+)?\'[^\']*(\\[\\abcEfnrtv0])+.*?
[\']' => q<unsafe echo with backslash>,
+       $LEADIN . qr'echo\s+(?:-[^e\s]+\s+)?\'[^\']*(\\[abcEfnrtv0])+.*?[\']' 
=> q<unsafe echo with backslash>,
        $LEADIN . qr'source\s+[\"\']?(?:\.\/|\/|\$|[\w.~-])[^\s]+' =>
                                       q<should be '.', not 'source'>,
     );

Stops warning about unsafe a backslashed backslash, since it works in all 
shells and is used by libtool.

-------------------


Cheers,
-- 
Raphael Geissert - Debian Maintainer
www.debian.org - get.debian.net
diff --git a/tmp/checkbashisms b/usr/bin/checkbashisms
index ee31784..38e9858 100755
--- a/tmp/checkbashisms
+++ b/usr/bin/checkbashisms
@@ -265,7 +265,7 @@ foreach my $filename (@ARGV) {
 		    $templine =~ s/$otherquote.*?$quote.*?$otherquote//g;
 		    # "\""
 		    $templine =~ s/(^|[^\\])$quote\\$quote$quote/$1/g;
-		    my $count = () = $templine =~ /(^|[^\\])$quote/g;
+		    my $count = () = $templine =~ /(^|(?!\\))$quote/g;
 
 		    # If there's an odd number of non-escaped
 		    # quotes in the line it's almost certainly the
@@ -451,6 +451,9 @@ sub script_is_evil_and_wrong {
 
 	    $ret = $. - 1;
 	    last;
+	} elsif (m'@DPATCH@') {
+	    $ret = $. - 1;
+	    last;
 	}
 
     }
@@ -461,7 +464,7 @@ sub script_is_evil_and_wrong {
 sub init_hashes {
 
     %bashisms = (
-	qr'(?:^|\s+)function \w+(\s|\(|\Z)' => q<'function' is useless>,
+	$LEADIN . qr'function \w+(\s|\(|\Z)' => q<'function' is useless>,
 	$LEADIN . qr'select\s+\w+' =>     q<'select' is not POSIX>,
 	qr'(test|-o|-a)\s*[^\s]+\s+==\s' =>
 	                               q<should be 'b = a'>,
@@ -477,7 +480,6 @@ sub init_hashes {
 	$LEADIN . qr'exec\s+-[acl]' =>    q<exec -c/-l/-a name>,
 	$LEADIN . qr'let\s' =>            q<let ...>,
 	qr'(?<![\$\(])\(\(.*\)\)' =>     q<'((' should be '$(('>,
-	qr'\$\[[^][]+\]' =>	       q<'$[' should be '$(('>,
 	qr'(?:^|\s+)(\[|test)\s+-a' =>            q<test with unary -a (should be -e)>,
 	qr'\&>' =>	               q<should be \>word 2\>&1>,
 	qr'(<\&|>\&)\s*((-|\d+)[^\s;|)`&\\\\]|[^-\d\s]+)' =>
@@ -508,14 +510,14 @@ sub init_hashes {
 	$LEADIN . qr'time\s' =>          q<time>,
 	$LEADIN . qr'dirs(\s|\Z)' =>          q<dirs>,
 	qr'(?:^|\s+)[<>]\(.*?\)'	    => q<\<() process substituion>,
-	qr'(?:^|\s+)readonly\s+-[af]' => q<readonly -[af]>,
+	$LEADIN . qr'readonly\s+-[af]' => q<readonly -[af]>,
 	$LEADIN . qr'(sh|\$\{?SHELL\}?) -[rD]' => q<sh -[rD]>,
 	$LEADIN . qr'(sh|\$\{?SHELL\}?) --\w+' =>  q<sh --long-option>,
 	$LEADIN . qr'(sh|\$\{?SHELL\}?) [-+]O' =>  q<sh [-+]O>,
     );
 
     %string_bashisms = (
-	qr'\$\[\w+\]' =>                 q<arithmetic not allowed>,
+	qr'\$\[[^][]+\]' =>	       q<'$[' should be '$(('>,
 	qr'\$\{\w+\:\d+(?::\d+)?\}' =>   q<${foo:3[:1]}>,
 	qr'\$\{!\w...@*]\}' =>           q<${!prefix[*|@]>,
 	qr'\$\{!\w+\}' =>                q<${!name}>,
@@ -533,11 +535,11 @@ sub init_hashes {
 	qr'\$\{?PIPESTATUS\}?\b'      => q<$PIPESTATUS>,
 	qr'\$\{?SHLVL\}?\b'           => q<$SHLVL>,
 	qr'<<<'                       => q<\<\<\< here string>,
-	$LEADIN . qr'echo\s+(?:-[^e\s]+\s+)?\"[^\"]*(\\[\\abcEfnrtv0])+.*?[\"]' => q<unsafe echo with backslash>,
+	$LEADIN . qr'echo\s+(?:-[^e\s]+\s+)?\"[^\"]*(\\[abcEfnrtv0])+.*?[\"]' => q<unsafe echo with backslash>,
     );
 
     %singlequote_bashisms = (
-	$LEADIN . qr'echo\s+(?:-[^e\s]+\s+)?\'[^\']*(\\[\\abcEfnrtv0])+.*?[\']' => q<unsafe echo with backslash>,
+	$LEADIN . qr'echo\s+(?:-[^e\s]+\s+)?\'[^\']*(\\[abcEfnrtv0])+.*?[\']' => q<unsafe echo with backslash>,
 	$LEADIN . qr'source\s+[\"\']?(?:\.\/|\/|\$|[\w.~-])[^\s]+' =>
 	                               q<should be '.', not 'source'>,
     );

Reply via email to