mirror of
https://github.com/sheumann/hush.git
synced 2025-01-02 09:31:26 +00:00
hush: fix $ expansion in redirections, add testcase for that
This commit is contained in:
parent
835068637e
commit
cccdc4e01a
@ -1,5 +1,8 @@
|
|||||||
Various bits of what is known about busybox shells, in no particular order.
|
Various bits of what is known about busybox shells, in no particular order.
|
||||||
|
|
||||||
|
2007-11-23
|
||||||
|
hush: fixed bogus glob handling; fixed exec <"$1"; added test and echo builtins
|
||||||
|
|
||||||
2007-06-13
|
2007-06-13
|
||||||
hush: exec <"$1" doesn't do parameter subst
|
hush: exec <"$1" doesn't do parameter subst
|
||||||
|
|
||||||
|
11
shell/hush.c
11
shell/hush.c
@ -1361,8 +1361,11 @@ static int setup_redirects(struct child_prog *prog, int squirrel[])
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (redir->dup == -1) {
|
if (redir->dup == -1) {
|
||||||
|
char *p;
|
||||||
mode = redir_table[redir->type].mode;
|
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) {
|
if (openfd < 0) {
|
||||||
/* this could get lost if stderr has been redirected, but
|
/* this could get lost if stderr has been redirected, but
|
||||||
bash and ash both lose it as well (though zsh doesn't!) */
|
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
|
} else
|
||||||
/* If or_mask is nonzero, we handle assignment 'a=....$@.....'
|
/* 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 $@ */
|
if (first_ch == ('@'|0x80) && !or_mask) { /* quoted $@ */
|
||||||
while (1) {
|
while (1) {
|
||||||
strcpy(pos, global_argv[i]);
|
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;
|
list[n++] = pos;
|
||||||
}
|
}
|
||||||
} else { /* quoted $*: add as one word */
|
} else { /* quoted $*: add as one word */
|
||||||
while (1) {
|
if (global_argv[i]) while (1) {
|
||||||
strcpy(pos, global_argv[i]);
|
strcpy(pos, global_argv[i]);
|
||||||
pos += strlen(global_argv[i]);
|
pos += strlen(global_argv[i]);
|
||||||
if (++i >= global_argc)
|
if (!global_argv[++i])
|
||||||
break;
|
break;
|
||||||
if (ifs[0])
|
if (ifs[0])
|
||||||
*pos++ = ifs[0];
|
*pos++ = ifs[0];
|
||||||
|
3
shell/hush_test/hush-vars/var_expand_in_redir.right
Normal file
3
shell/hush_test/hush-vars/var_expand_in_redir.right
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
TEST1
|
||||||
|
TEST2
|
||||||
|
TEST3
|
13
shell/hush_test/hush-vars/var_expand_in_redir.tests
Executable file
13
shell/hush_test/hush-vars/var_expand_in_redir.tests
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
if test $# = 0; then
|
||||||
|
exec "$THIS_SH" "$0" abc "d e"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo TEST1 >"$1.out"
|
||||||
|
echo TEST2 >"$2.out"
|
||||||
|
# bash says: "$@.out": ambiguous redirect
|
||||||
|
# ash handles it as if it is '$*' - we do the same
|
||||||
|
echo TEST3 >"$@.out"
|
||||||
|
|
||||||
|
cat abc.out "d e.out" "abc d e.out"
|
||||||
|
|
||||||
|
rm abc.out "d e.out" "abc d e.out"
|
@ -11,6 +11,7 @@ export THIS_SH
|
|||||||
do_test()
|
do_test()
|
||||||
{
|
{
|
||||||
test -d "$1" || return 0
|
test -d "$1" || return 0
|
||||||
|
# echo Running tests in directory "$1"
|
||||||
(
|
(
|
||||||
cd "$1" || { echo "cannot cd $1!"; exit 1; }
|
cd "$1" || { echo "cannot cd $1!"; exit 1; }
|
||||||
for x in run-*; do
|
for x in run-*; do
|
||||||
|
Loading…
Reference in New Issue
Block a user