hush: fix $ expansion in redirections, add testcase for that
This commit is contained in:
11
shell/hush.c
11
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];
|
||||
|
||||
Reference in New Issue
Block a user