]> git.pld-linux.org Git - packages/bash.git/blob - bash31-010
- up to 011
[packages/bash.git] / bash31-010
1                              BASH PATCH REPORT
2                              =================
3
4 Bash-Release: 3.1
5 Patch-ID: bash31-010
6
7 Bug-Reported-by: vw@vonwolff.de
8 Bug-Reference-ID: <20060123135234.1AC2F1D596@wst07.vonwolff.de>
9 Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-01/msg00090.html
10
11 Bug-Description:
12
13 There is a difference in behavior between bash-3.0 and bash-3.1 involving
14 parsing of single- and double-quoted strings occurring in old-style
15 command substitution.  The difference has to do with how backslashes are
16 processed.  This patch restores a measure of backwards compatibility while
17 the question of POSIX conformance and ultimately correct behavior is discussed.
18
19 THIS IS AN UPDATED PATCH.  USE THIS COMMAND TO REVERSE THE EFFECTS OF
20 THE ORIGINAL PATCH.  THE CURRENT DIRECTORY MUST BE THE BASH-3.1 SOURCE
21 DIRECTORY.
22
23 patch -p0 -R < bash31-010.orig
24
25 Then apply this patch as usual.
26
27 Patch:
28
29 *** ../bash-3.1/parse.y Fri Nov 11 23:14:18 2005
30 --- parse.y     Thu Feb 23 08:21:12 2006
31 ***************
32 *** 2716,2721 ****
33 --- 2723,2729 ----
34   #define P_ALLOWESC    0x02
35   #define P_DQUOTE      0x04
36   #define P_COMMAND     0x08    /* parsing a command, so look for comments */
37 + #define P_BACKQUOTE   0x10    /* parsing a backquoted command substitution */
38   
39   static char matched_pair_error;
40   static char *
41 ***************
42 *** 2725,2736 ****
43        int *lenp, flags;
44   {
45     int count, ch, was_dollar, in_comment, check_comment;
46 !   int pass_next_character, nestlen, ttranslen, start_lineno;
47     char *ret, *nestret, *ttrans;
48     int retind, retsize, rflags;
49   
50     count = 1;
51 !   pass_next_character = was_dollar = in_comment = 0;
52     check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
53   
54     /* RFLAGS is the set of flags we want to pass to recursive calls. */
55 --- 2733,2744 ----
56        int *lenp, flags;
57   {
58     int count, ch, was_dollar, in_comment, check_comment;
59 !   int pass_next_character, backq_backslash, nestlen, ttranslen, start_lineno;
60     char *ret, *nestret, *ttrans;
61     int retind, retsize, rflags;
62   
63     count = 1;
64 !   pass_next_character = backq_backslash = was_dollar = in_comment = 0;
65     check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
66   
67     /* RFLAGS is the set of flags we want to pass to recursive calls. */
68 ***************
69 *** 2742,2752 ****
70     start_lineno = line_number;
71     while (count)
72       {
73 ! #if 0
74 !       ch = shell_getc ((qc != '\'' || (flags & P_ALLOWESC)) && pass_next_character == 0);
75 ! #else
76 !       ch = shell_getc (qc != '\'' && pass_next_character == 0);
77 ! #endif
78         if (ch == EOF)
79         {
80           free (ret);
81 --- 2750,2757 ----
82     start_lineno = line_number;
83     while (count)
84       {
85 !       ch = shell_getc (qc != '\'' && pass_next_character == 0 && backq_backslash == 0);
86
87         if (ch == EOF)
88         {
89           free (ret);
90 ***************
91 *** 2771,2779 ****
92           continue;
93         }
94         /* Not exactly right yet */
95 !       else if (check_comment && in_comment == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || whitespace (ret[retind -1])))
96         in_comment = 1;
97   
98         if (pass_next_character)                /* last char was backslash */
99         {
100           pass_next_character = 0;
101 --- 2776,2791 ----
102           continue;
103         }
104         /* Not exactly right yet */
105 !       else if MBTEST(check_comment && in_comment == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || whitespace (ret[retind - 1])))
106         in_comment = 1;
107   
108 +       /* last char was backslash inside backquoted command substitution */
109 +       if (backq_backslash)
110 +       {
111 +         backq_backslash = 0;
112 +         /* Placeholder for adding special characters */
113 +       }
114
115         if (pass_next_character)                /* last char was backslash */
116         {
117           pass_next_character = 0;
118 ***************
119 *** 2814,2819 ****
120 --- 2824,2831 ----
121         {
122           if MBTEST((flags & P_ALLOWESC) && ch == '\\')
123             pass_next_character++;
124 +         else if MBTEST((flags & P_BACKQUOTE) && ch == '\\')
125 +           backq_backslash++;
126           continue;
127         }
128   
129 ***************
130 *** 2898,2904 ****
131         }
132         else if MBTEST(qc == '`' && (ch == '"' || ch == '\'') && in_comment == 0)
133         {
134 !         nestret = parse_matched_pair (0, ch, ch, &nestlen, rflags);
135           goto add_nestret;
136         }
137         else if MBTEST(was_dollar && (ch == '(' || ch == '{' || ch == '['))     /* ) } ] */
138 --- 2910,2920 ----
139         }
140         else if MBTEST(qc == '`' && (ch == '"' || ch == '\'') && in_comment == 0)
141         {
142 !         /* Add P_BACKQUOTE so backslash quotes the next character and
143 !            shell_getc does the right thing with \<newline>.  We do this for
144 !            a measure  of backwards compatibility -- it's not strictly the
145 !            right POSIX thing. */
146 !         nestret = parse_matched_pair (0, ch, ch, &nestlen, rflags|P_BACKQUOTE);
147           goto add_nestret;
148         }
149         else if MBTEST(was_dollar && (ch == '(' || ch == '{' || ch == '['))     /* ) } ] */
150 *** ../bash-3.1/patchlevel.h    Wed Jul 20 13:58:20 2005
151 --- patchlevel.h        Wed Dec  7 13:48:42 2005
152 ***************
153 *** 26,30 ****
154      looks for to find the patch level (for the sccs version string). */
155   
156 ! #define PATCHLEVEL 9
157   
158   #endif /* _PATCHLEVEL_H_ */
159 --- 26,30 ----
160      looks for to find the patch level (for the sccs version string). */
161   
162 ! #define PATCHLEVEL 10
163   
164   #endif /* _PATCHLEVEL_H_ */
This page took 0.107297 seconds and 3 git commands to generate.