diff options
author | Denis Vlasenko | 2007-11-23 21:08:38 +0000 |
---|---|---|
committer | Denis Vlasenko | 2007-11-23 21:08:38 +0000 |
commit | cccdc4e01abb354c50aa483a21d5ff56a18c0b4a (patch) | |
tree | 4290b391d3ea634a0393082c2233935bf5357afc /shell/hush.c | |
parent | 835068637e81771a1b45b9faf04a31830f0e5d8a (diff) | |
download | busybox-cccdc4e01abb354c50aa483a21d5ff56a18c0b4a.zip busybox-cccdc4e01abb354c50aa483a21d5ff56a18c0b4a.tar.gz |
hush: fix $ expansion in redirections, add testcase for that
Diffstat (limited to 'shell/hush.c')
-rw-r--r-- | shell/hush.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/shell/hush.c b/shell/hush.c index 04afbfd..912cbb5 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -1361,8 +1361,11 @@ static int setup_redirects(struct child_prog *prog, int squirrel[]) continue; } if (redir->dup == -1) { + char *p; mode = redir_table[redir->type].mode; - openfd = open_or_warn(redir->glob_word[0], mode); + p = expand_string_to_string(redir->glob_word[0]); + openfd = open_or_warn(p, mode); + free(p); if (openfd < 0) { /* this could get lost if stderr has been redirected, but bash and ash both lose it as well (though zsh doesn't!) */ @@ -2579,7 +2582,7 @@ static int expand_vars_to_list(char **list, int n, char **posp, char *arg, char } } else /* If or_mask is nonzero, we handle assignment 'a=....$@.....' - * and in this case should theat it like '$*' */ + * and in this case should treat it like '$*' - see 'else...' below */ if (first_ch == ('@'|0x80) && !or_mask) { /* quoted $@ */ while (1) { strcpy(pos, global_argv[i]); @@ -2593,10 +2596,10 @@ static int expand_vars_to_list(char **list, int n, char **posp, char *arg, char list[n++] = pos; } } else { /* quoted $*: add as one word */ - while (1) { + if (global_argv[i]) while (1) { strcpy(pos, global_argv[i]); pos += strlen(global_argv[i]); - if (++i >= global_argc) + if (!global_argv[++i]) break; if (ifs[0]) *pos++ = ifs[0]; |