Package: bash
Version: 4.2+dfsg-0.1
Severity: important
Tags: patch
Dear Maintainer,
This problem was also reported upstream:
http://lists.gnu.org/archive/html/bug-bash/2014-01/msg00050.html
Here is my script to reproduce:
$ bash -c 'set -- "" ; echo $#; set -- "${@:2}"; echo $#'
1
0
$ bash -c 'set -- "" ""; echo $#; set -- "${@:2}"; echo $#'
2
0
$ bash -c 'set -- "" "" ""; echo $#; set -- "${@:2}"; echo $#'
3
2
This is with GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu).
The proposed patch is a backport of what went into 4.3-rc2 to fix the problem.
Regards,
Jan
-- System Information:
Debian Release: 7.4
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)
Kernel: Linux 3.2.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages bash depends on:
ii base-files 7.1wheezy4
ii dash 0.5.7-3
ii debianutils 4.3.2
ii libc6 2.13-38+deb7u1
ii libtinfo5 5.9-10
Versions of packages bash recommends:
ii bash-completion 1:2.0-1
Versions of packages bash suggests:
pn bash-doc <none>
-- no debconf information
Index: bash-4.2+dfsg/bash/subst.c
===================================================================
--- bash-4.2+dfsg.orig/bash/subst.c
+++ bash-4.2+dfsg/bash/subst.c
@@ -7238,7 +7238,9 @@ parameter_brace_expand (string, indexp,
ret = alloc_word_desc ();
ret->word = temp1;
- if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+ if (temp1 &&
+ (quoted_dollar_atp == 0 || *quoted_dollar_atp == 0) &&
+ QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
ret->flags |= W_QUOTED|W_HASQUOTEDNULL;
return ret;
}
@@ -7258,7 +7260,9 @@ parameter_brace_expand (string, indexp,
ret->word = temp1;
ret = alloc_word_desc ();
ret->word = temp1;
- if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+ if (temp1 &&
+ (quoted_dollar_atp == 0 || *quoted_dollar_atp == 0) &&
+ QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
ret->flags |= W_QUOTED|W_HASQUOTEDNULL;
return ret;
}
@@ -7277,7 +7281,9 @@ parameter_brace_expand (string, indexp,
ret = alloc_word_desc ();
ret->word = temp1;
- if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+ if (temp1 &&
+ (quoted_dollar_atp == 0 || *quoted_dollar_atp == 0) &&
+ QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
ret->flags |= W_QUOTED|W_HASQUOTEDNULL;
return ret;
}
@@ -7313,7 +7319,13 @@ parameter_brace_expand (string, indexp,
ret = alloc_word_desc ();
ret->word = temp1;
- if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+ /* We test quoted_dollar_atp because we want variants with double-quoted
+ "$@" to take a different code path. In fact, we make sure at the end
+ of expand_word_internal that we're only looking at these flags if
+ quoted_dollar_at == 0. */
+ if (temp1 &&
+ (quoted_dollar_atp == 0 || *quoted_dollar_atp == 0) &&
+ QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
ret->flags |= W_QUOTED|W_HASQUOTEDNULL;
return ret;