]> git.pld-linux.org Git - packages/bash.git/blame - bash42-012
up to 4.2.45
[packages/bash.git] / bash42-012
CommitLineData
81c0d887
AM
1 BASH PATCH REPORT
2 =================
3
4Bash-Release: 4.2
5Patch-ID: bash42-012
6
7Bug-Reported-by: Rui Santos <rsantos@grupopie.com>
8Bug-Reference-ID: <4E04C6D0.2020507@grupopie.com>
9Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-06/msg00079.html
10
11Bug-Description:
12
13When calling the parser to recursively parse a command substitution within
14an arithmetic expansion, the shell overwrote the saved shell input line and
15associated state, resulting in a garbled command.
16
17Patch (apply with `patch -p0'):
18
19*** ../bash-4.2-patched/parse.y 2011-02-26 19:19:05.000000000 -0500
20--- parse.y 2011-06-24 20:08:22.000000000 -0400
21***************
22*** 3843,3846 ****
23--- 3849,3853 ----
24 {
25 sh_parser_state_t ps;
26+ sh_input_line_state_t ls;
27 int orig_ind, nc, sflags;
28 char *ret, *s, *ep, *ostring;
29***************
30*** 3850,3857 ****
31--- 3857,3866 ----
32 ostring = string;
33
34+ /*itrace("xparse_dolparen: size = %d shell_input_line = `%s'", shell_input_line_size, shell_input_line);*/
35 sflags = SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOFREE;
36 if (flags & SX_NOLONGJMP)
37 sflags |= SEVAL_NOLONGJMP;
38 save_parser_state (&ps);
39+ save_input_line_state (&ls);
40
41 /*(*/
42***************
43*** 3862,3865 ****
44--- 3871,3876 ----
45 restore_parser_state (&ps);
46 reset_parser ();
47+ /* reset_parser clears shell_input_line and associated variables */
48+ restore_input_line_state (&ls);
49 if (interactive)
50 token_to_read = 0;
51***************
52*** 5909,5912 ****
53--- 5920,5929 ----
54 ps->echo_input_at_read = echo_input_at_read;
55
56+ ps->token = token;
57+ ps->token_buffer_size = token_buffer_size;
58+ /* Force reallocation on next call to read_token_word */
59+ token = 0;
60+ token_buffer_size = 0;
61+
62 return (ps);
63 }
64***************
65*** 5950,5953 ****
66--- 5967,6006 ----
67 expand_aliases = ps->expand_aliases;
68 echo_input_at_read = ps->echo_input_at_read;
69+
70+ FREE (token);
71+ token = ps->token;
72+ token_buffer_size = ps->token_buffer_size;
73+ }
74+
75+ sh_input_line_state_t *
76+ save_input_line_state (ls)
77+ sh_input_line_state_t *ls;
78+ {
79+ if (ls == 0)
80+ ls = (sh_input_line_state_t *)xmalloc (sizeof (sh_input_line_state_t));
81+ if (ls == 0)
82+ return ((sh_input_line_state_t *)NULL);
83+
84+ ls->input_line = shell_input_line;
85+ ls->input_line_size = shell_input_line_size;
86+ ls->input_line_len = shell_input_line_len;
87+ ls->input_line_index = shell_input_line_index;
88+
89+ /* force reallocation */
90+ shell_input_line = 0;
91+ shell_input_line_size = shell_input_line_len = shell_input_line_index = 0;
92+ }
93+
94+ void
95+ restore_input_line_state (ls)
96+ sh_input_line_state_t *ls;
97+ {
98+ FREE (shell_input_line);
99+ shell_input_line = ls->input_line;
100+ shell_input_line_size = ls->input_line_size;
101+ shell_input_line_len = ls->input_line_len;
102+ shell_input_line_index = ls->input_line_index;
103+
104+ set_line_mbstate ();
105 }
106
107*** ../bash-4.2-patched/shell.h 2011-01-06 22:16:55.000000000 -0500
108--- shell.h 2011-06-24 19:12:25.000000000 -0400
109***************
110*** 137,140 ****
111--- 139,145 ----
112 int *token_state;
113
114+ char *token;
115+ int token_buffer_size;
116+
117 /* input line state -- line number saved elsewhere */
118 int input_line_terminator;
119***************
120*** 167,171 ****
121--- 172,186 ----
122 } sh_parser_state_t;
123
124+ typedef struct _sh_input_line_state_t {
125+ char *input_line;
126+ int input_line_index;
127+ int input_line_size;
128+ int input_line_len;
129+ } sh_input_line_state_t;
130+
131 /* Let's try declaring these here. */
132 extern sh_parser_state_t *save_parser_state __P((sh_parser_state_t *));
133 extern void restore_parser_state __P((sh_parser_state_t *));
134+
135+ extern sh_input_line_state_t *save_input_line_state __P((sh_input_line_state_t *));
136+ extern void restore_input_line_state __P((sh_input_line_state_t *));
137*** ../bash-4.2-patched/patchlevel.h Sat Jun 12 20:14:48 2010
138--- patchlevel.h Thu Feb 24 21:41:34 2011
139***************
140*** 26,30 ****
141 looks for to find the patch level (for the sccs version string). */
142
143! #define PATCHLEVEL 11
144
145 #endif /* _PATCHLEVEL_H_ */
146--- 26,30 ----
147 looks for to find the patch level (for the sccs version string). */
148
149! #define PATCHLEVEL 12
150
151 #endif /* _PATCHLEVEL_H_ */
This page took 0.041784 seconds and 4 git commands to generate.