summaryrefslogtreecommitdiff
path: root/package/bash/bash31-010
diff options
context:
space:
mode:
Diffstat (limited to 'package/bash/bash31-010')
-rw-r--r--package/bash/bash31-010164
1 files changed, 164 insertions, 0 deletions
diff --git a/package/bash/bash31-010 b/package/bash/bash31-010
new file mode 100644
index 000000000..19277a88f
--- /dev/null
+++ b/package/bash/bash31-010
@@ -0,0 +1,164 @@
+ 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_ */