123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- 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_ */
|