summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/Modules/socket.c5
-rw-r--r--Src/exec.c23
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();
}
}