summaryrefslogtreecommitdiff
path: root/Src/exec.c
diff options
context:
space:
mode:
authorBarton E. Schaefer <schaefer@zsh.org>2014-09-03 08:46:56 -0700
committerBarton E. Schaefer <schaefer@zsh.org>2014-09-03 08:46:56 -0700
commita3b1e3ffb1765943aef4a1d74f66ffe5f899ac02 (patch)
tree163865bbaeae646dd058bfeb307843ce14d12c44 /Src/exec.c
parent6d9635b0bd3c5e0a2445b01b40727ec295863d00 (diff)
downloadzsh-a3b1e3ffb1765943aef4a1d74f66ffe5f899ac02.tar.gz
zsh-a3b1e3ffb1765943aef4a1d74f66ffe5f899ac02.zip
33100: check $fd more rigorously in "exec {fd}<&-"
Diffstat (limited to 'Src/exec.c')
-rw-r--r--Src/exec.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/Src/exec.c b/Src/exec.c
index bf50d0f32..fb2739acc 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -3050,7 +3050,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
break;
case REDIR_CLOSE:
if (fn->varid) {
- char *s = fn->varid;
+ char *s = fn->varid, *t;
struct value vbuf;
Value v;
int bad = 0;
@@ -3060,13 +3060,25 @@ execcmd(Estate state, int input, int output, int how, int last1)
} else if (v->pm->node.flags & PM_READONLY) {
bad = 2;
} else {
- fn->fd1 = (int)getintvalue(v);
+ s = getstrvalue(v);
if (errflag)
bad = 1;
- else if (fn->fd1 <= max_zsh_fd) {
- if (fn->fd1 >= 10 &&
- fdtable[fn->fd1] == FDT_INTERNAL)
- bad = 3;
+ else {
+ fn->fd1 = zstrtol(s, &t, 0);
+ if (s == t)
+ bad = 1;
+ else if (*t) {
+ /* Check for base#number format */
+ if (*t == '#' && *s != '0')
+ fn->fd1 = zstrtol(s = t+1, &t, fn->fd1);
+ if (s == t || *t)
+ bad = 1;
+ }
+ if (!bad && fn->fd1 <= max_zsh_fd) {
+ if (fn->fd1 >= 10 &&
+ fdtable[fn->fd1] == FDT_INTERNAL)
+ bad = 3;
+ }
}
}
if (bad) {