BASH PATCH REPORT ================= Bash-Release: 4.2 Patch-ID: bash42-046 Bug-Reported-by: "Theodoros V. Kalamatianos" Bug-Reference-ID: <20140112011131.GE17667@infinity.metashade.com> Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-01/msg00044.html Bug-Description: Bash-4.2 patch 32 introduced a problem with "$@" and arrays expanding empty positional parameters or array elements when using substring expansion, pattern substitution, or case modfication. The empty parameters or array elements are removed instead of expanding to empty strings (""). Patch (apply with `patch -p0'): *** ../bash-4.2-patched/subst.c 2012-12-31 11:52:56.000000000 -0500 --- subst.c 2014-03-31 14:19:56.000000000 -0400 *************** *** 7243,7247 **** ret = alloc_word_desc (); ret->word = temp1; ! if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))) ret->flags |= W_QUOTED|W_HASQUOTEDNULL; return ret; --- 7243,7253 ---- ret = alloc_word_desc (); ret->word = temp1; ! /* 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; *** ../bash-4.2-patched/patchlevel.h Sat Jun 12 20:14:48 2010 --- patchlevel.h Thu Feb 24 21:41:34 2011 *************** *** 26,30 **** looks for to find the patch level (for the sccs version string). */ ! #define PATCHLEVEL 45 #endif /* _PATCHLEVEL_H_ */ --- 26,30 ---- looks for to find the patch level (for the sccs version string). */ ! #define PATCHLEVEL 46 #endif /* _PATCHLEVEL_H_ */