aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shell/hush.c62
1 files changed, 34 insertions, 28 deletions
diff --git a/shell/hush.c b/shell/hush.c
index ca01e2b5b..0c91008b9 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -9250,6 +9250,37 @@ static int checkjobs_and_fg_shell(struct pipe *fg_pipe)
9250 * backgrounded: cmd & { list } & 9250 * backgrounded: cmd & { list } &
9251 * subshell: ( list ) [&] 9251 * subshell: ( list ) [&]
9252 */ 9252 */
9253static void set_G_ifs(void)
9254{
9255 /* Testcase: set -- q w e; (IFS='' echo "$*"; IFS=''; echo "$*"); echo "$*"
9256 * Result should be 3 lines: q w e, qwe, q w e
9257 */
9258 if (G.ifs_whitespace != G.ifs)
9259 free(G.ifs_whitespace);
9260 G.ifs = get_local_var_value("IFS");
9261 if (G.ifs) {
9262 char *p;
9263 G.ifs_whitespace = (char*)G.ifs;
9264 p = skip_whitespace(G.ifs);
9265 if (*p) {
9266 /* Not all $IFS is whitespace */
9267 char *d;
9268 int len = p - G.ifs;
9269 p = skip_non_whitespace(p);
9270 G.ifs_whitespace = xmalloc(len + strlen(p) + 1); /* can overestimate */
9271 d = mempcpy(G.ifs_whitespace, G.ifs, len);
9272 while (*p) {
9273 if (isspace(*p))
9274 *d++ = *p;
9275 p++;
9276 }
9277 *d = '\0';
9278 }
9279 } else {
9280 G.ifs = defifs;
9281 G.ifs_whitespace = (char*)G.ifs;
9282 }
9283}
9253#if !ENABLE_HUSH_MODE_X 9284#if !ENABLE_HUSH_MODE_X
9254#define redirect_and_varexp_helper(command, sqp, argv_expanded) \ 9285#define redirect_and_varexp_helper(command, sqp, argv_expanded) \
9255 redirect_and_varexp_helper(command, sqp) 9286 redirect_and_varexp_helper(command, sqp)
@@ -9286,34 +9317,7 @@ static NOINLINE int run_pipe(struct pipe *pi)
9286 debug_printf_exec("run_pipe start: members:%d\n", pi->num_cmds); 9317 debug_printf_exec("run_pipe start: members:%d\n", pi->num_cmds);
9287 debug_enter(); 9318 debug_enter();
9288 9319
9289 /* Testcase: set -- q w e; (IFS='' echo "$*"; IFS=''; echo "$*"); echo "$*" 9320 set_G_ifs();
9290 * Result should be 3 lines: q w e, qwe, q w e
9291 */
9292 if (G.ifs_whitespace != G.ifs)
9293 free(G.ifs_whitespace);
9294 G.ifs = get_local_var_value("IFS");
9295 if (G.ifs) {
9296 char *p;
9297 G.ifs_whitespace = (char*)G.ifs;
9298 p = skip_whitespace(G.ifs);
9299 if (*p) {
9300 /* Not all $IFS is whitespace */
9301 char *d;
9302 int len = p - G.ifs;
9303 p = skip_non_whitespace(p);
9304 G.ifs_whitespace = xmalloc(len + strlen(p) + 1); /* can overestimate */
9305 d = mempcpy(G.ifs_whitespace, G.ifs, len);
9306 while (*p) {
9307 if (isspace(*p))
9308 *d++ = *p;
9309 p++;
9310 }
9311 *d = '\0';
9312 }
9313 } else {
9314 G.ifs = defifs;
9315 G.ifs_whitespace = (char*)G.ifs;
9316 }
9317 9321
9318 IF_HUSH_JOB(pi->pgrp = -1;) 9322 IF_HUSH_JOB(pi->pgrp = -1;)
9319 pi->stopped_cmds = 0; 9323 pi->stopped_cmds = 0;
@@ -9758,6 +9762,8 @@ static int run_list(struct pipe *pi)
9758 debug_printf_exec("run_list lvl %d start\n", G.run_list_level); 9762 debug_printf_exec("run_list lvl %d start\n", G.run_list_level);
9759 debug_enter(); 9763 debug_enter();
9760 9764
9765 set_G_ifs();
9766
9761#if ENABLE_HUSH_LOOPS 9767#if ENABLE_HUSH_LOOPS
9762 /* Check syntax for "for" */ 9768 /* Check syntax for "for" */
9763 { 9769 {