diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2005-04-15 10:40:01 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2005-04-15 10:40:01 +0000 |
commit | d6089cc8b17ed7d33850bb9075a9c6771fe120d6 (patch) | |
tree | a784b891867af1aef0e10b19fca30d066dc61f84 | |
parent | c69b149cb5ce6446eb267074f640e34ca726a45d (diff) | |
download | zsh-d6089cc8b17ed7d33850bb9075a9c6771fe120d6.tar.gz zsh-d6089cc8b17ed7d33850bb9075a9c6771fe120d6.tar.xz zsh-d6089cc8b17ed7d33850bb9075a9c6771fe120d6.zip |
21143: more care about special file descriptors
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/Modules/socket.c | 5 | ||||
-rw-r--r-- | Src/exec.c | 23 |
3 files changed, 26 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog index d81404c24..ccf5a75bb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-04-15 Peter Stephenson <pws@csr.com> + + * 21143: Src/exec.c, Src/Modules/socket.c: be more careful when + closing or opening sockets onto file descriptors. + 2005-04-14 Peter Stephenson <pws@csr.com> * 21141: Doc/Zsh/redirect.yo, Src/exec.c, Test/A04redirect.ztst: 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(); } } |