diff options
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Modules/socket.c | 5 | ||||
-rw-r--r-- | Src/exec.c | 23 |
2 files changed, 21 insertions, 7 deletions
diff --git a/Src/Modules/socket.c b/Src/Modules/socket.c index 3a2c590a1..2f95a84d5 100644 --- a/Src/Modules/socket.c +++ b/Src/Modules/socket.c @@ -78,6 +78,11 @@ bin_zsocket(char *nam, char **args, Options ops, UNUSED(int func)) OPT_ARG(ops, 'd'), 0); return 1; } + if (targetfd <= max_zsh_fd && fdtable[targetfd] != FDT_UNUSED) { + zwarnnam(nam, "file descriptor %d is in use by the shell", + NULL, targetfd); + return 1; + } } if (OPT_ISSET(ops,'l')) { diff --git a/Src/exec.c b/Src/exec.c index 1ac3f50fd..f5feba50b 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -77,7 +77,7 @@ long lastval2; * by zclose. */ /**/ -unsigned char *fdtable; +mod_export unsigned char *fdtable; /* The allocated size of fdtable */ @@ -87,7 +87,7 @@ int fdtable_size; /* The highest fd that marked with nonzero in fdtable */ /**/ -int max_zsh_fd; +mod_export int max_zsh_fd; /* input fd from the coprocess */ @@ -2360,13 +2360,22 @@ execcmd(Estate state, int input, int output, int how, int last1) bad = 2; } else { fn->fd1 = (int)getintvalue(v); - bad = errflag; + if (errflag) + bad = 1; + else if (fn->fd1 > max_zsh_fd) + bad = 3; + else if (fn->fd1 >= 10 && + fdtable[fn->fd1] == FDT_INTERNAL) + bad = 4; } if (bad) { - zwarn(bad == 2 ? - "can't close file descriptor from readonly parameter" : - "parameter %s does not contain a file descriptor", - fn->varid, 0); + const char *bad_msg[] = { + "parameter %s does not contain a file descriptor", + "can't close file descriptor from readonly parameter %s", + "file descriptor %d out of range, not closed", + "file descriptor %d used by shell, not closed" + }; + zwarn(bad_msg[bad-1], fn->varid, fn->fd1); execerr(); } } |