165 lines
5.1 KiB
Plaintext
165 lines
5.1 KiB
Plaintext
BASH PATCH REPORT
|
|
=================
|
|
|
|
Bash-Release: 3.1
|
|
Patch-ID: bash31-010
|
|
|
|
Bug-Reported-by: vw@vonwolff.de
|
|
Bug-Reference-ID: <20060123135234.1AC2F1D596@wst07.vonwolff.de>
|
|
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-01/msg00090.html
|
|
|
|
Bug-Description:
|
|
|
|
There is a difference in behavior between bash-3.0 and bash-3.1 involving
|
|
parsing of single- and double-quoted strings occurring in old-style
|
|
command substitution. The difference has to do with how backslashes are
|
|
processed. This patch restores a measure of backwards compatibility while
|
|
the question of POSIX conformance and ultimately correct behavior is discussed.
|
|
|
|
THIS IS AN UPDATED PATCH. USE THIS COMMAND TO REVERSE THE EFFECTS OF
|
|
THE ORIGINAL PATCH. THE CURRENT DIRECTORY MUST BE THE BASH-3.1 SOURCE
|
|
DIRECTORY.
|
|
|
|
patch -p0 -R < bash31-010.orig
|
|
|
|
Then apply this patch as usual.
|
|
|
|
Patch:
|
|
|
|
*** bash-3.1/parse.y Fri Nov 11 23:14:18 2005
|
|
--- bash-3.1/parse.y Thu Feb 23 08:21:12 2006
|
|
***************
|
|
*** 2716,2721 ****
|
|
--- 2723,2729 ----
|
|
#define P_ALLOWESC 0x02
|
|
#define P_DQUOTE 0x04
|
|
#define P_COMMAND 0x08 /* parsing a command, so look for comments */
|
|
+ #define P_BACKQUOTE 0x10 /* parsing a backquoted command substitution */
|
|
|
|
static char matched_pair_error;
|
|
static char *
|
|
***************
|
|
*** 2725,2736 ****
|
|
int *lenp, flags;
|
|
{
|
|
int count, ch, was_dollar, in_comment, check_comment;
|
|
! int pass_next_character, nestlen, ttranslen, start_lineno;
|
|
char *ret, *nestret, *ttrans;
|
|
int retind, retsize, rflags;
|
|
|
|
count = 1;
|
|
! pass_next_character = was_dollar = in_comment = 0;
|
|
check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
|
|
|
|
/* RFLAGS is the set of flags we want to pass to recursive calls. */
|
|
--- 2733,2744 ----
|
|
int *lenp, flags;
|
|
{
|
|
int count, ch, was_dollar, in_comment, check_comment;
|
|
! int pass_next_character, backq_backslash, nestlen, ttranslen, start_lineno;
|
|
char *ret, *nestret, *ttrans;
|
|
int retind, retsize, rflags;
|
|
|
|
count = 1;
|
|
! pass_next_character = backq_backslash = was_dollar = in_comment = 0;
|
|
check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
|
|
|
|
/* RFLAGS is the set of flags we want to pass to recursive calls. */
|
|
***************
|
|
*** 2742,2752 ****
|
|
start_lineno = line_number;
|
|
while (count)
|
|
{
|
|
! #if 0
|
|
! ch = shell_getc ((qc != '\'' || (flags & P_ALLOWESC)) && pass_next_character == 0);
|
|
! #else
|
|
! ch = shell_getc (qc != '\'' && pass_next_character == 0);
|
|
! #endif
|
|
if (ch == EOF)
|
|
{
|
|
free (ret);
|
|
--- 2750,2757 ----
|
|
start_lineno = line_number;
|
|
while (count)
|
|
{
|
|
! ch = shell_getc (qc != '\'' && pass_next_character == 0 && backq_backslash == 0);
|
|
!
|
|
if (ch == EOF)
|
|
{
|
|
free (ret);
|
|
***************
|
|
*** 2771,2779 ****
|
|
continue;
|
|
}
|
|
/* Not exactly right yet */
|
|
! else if (check_comment && in_comment == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || whitespace (ret[retind -1])))
|
|
in_comment = 1;
|
|
|
|
if (pass_next_character) /* last char was backslash */
|
|
{
|
|
pass_next_character = 0;
|
|
--- 2776,2791 ----
|
|
continue;
|
|
}
|
|
/* Not exactly right yet */
|
|
! else if MBTEST(check_comment && in_comment == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || whitespace (ret[retind - 1])))
|
|
in_comment = 1;
|
|
|
|
+ /* last char was backslash inside backquoted command substitution */
|
|
+ if (backq_backslash)
|
|
+ {
|
|
+ backq_backslash = 0;
|
|
+ /* Placeholder for adding special characters */
|
|
+ }
|
|
+
|
|
if (pass_next_character) /* last char was backslash */
|
|
{
|
|
pass_next_character = 0;
|
|
***************
|
|
*** 2814,2819 ****
|
|
--- 2824,2831 ----
|
|
{
|
|
if MBTEST((flags & P_ALLOWESC) && ch == '\\')
|
|
pass_next_character++;
|
|
+ else if MBTEST((flags & P_BACKQUOTE) && ch == '\\')
|
|
+ backq_backslash++;
|
|
continue;
|
|
}
|
|
|
|
***************
|
|
*** 2898,2904 ****
|
|
}
|
|
else if MBTEST(qc == '`' && (ch == '"' || ch == '\'') && in_comment == 0)
|
|
{
|
|
! nestret = parse_matched_pair (0, ch, ch, &nestlen, rflags);
|
|
goto add_nestret;
|
|
}
|
|
else if MBTEST(was_dollar && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
|
|
--- 2910,2920 ----
|
|
}
|
|
else if MBTEST(qc == '`' && (ch == '"' || ch == '\'') && in_comment == 0)
|
|
{
|
|
! /* Add P_BACKQUOTE so backslash quotes the next character and
|
|
! shell_getc does the right thing with \<newline>. We do this for
|
|
! a measure of backwards compatibility -- it's not strictly the
|
|
! right POSIX thing. */
|
|
! nestret = parse_matched_pair (0, ch, ch, &nestlen, rflags|P_BACKQUOTE);
|
|
goto add_nestret;
|
|
}
|
|
else if MBTEST(was_dollar && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
|
|
*** bash-3.1/patchlevel.h Wed Jul 20 13:58:20 2005
|
|
--- bash-3.1/patchlevel.h Wed Dec 7 13:48:42 2005
|
|
***************
|
|
*** 26,30 ****
|
|
looks for to find the patch level (for the sccs version string). */
|
|
|
|
! #define PATCHLEVEL 9
|
|
|
|
#endif /* _PATCHLEVEL_H_ */
|
|
--- 26,30 ----
|
|
looks for to find the patch level (for the sccs version string). */
|
|
|
|
! #define PATCHLEVEL 10
|
|
|
|
#endif /* _PATCHLEVEL_H_ */
|