|
|
dc1902 |
diff -up ksh-20120801/src/cmd/ksh93/include/io.h.safefd ksh-20120801/src/cmd/ksh93/include/io.h
|
|
|
dc1902 |
--- ksh-20120801/src/cmd/ksh93/include/io.h.safefd 2015-03-03 18:21:40.544732158 +0100
|
|
|
dc1902 |
+++ ksh-20120801/src/cmd/ksh93/include/io.h 2015-03-03 18:22:16.284447849 +0100
|
|
|
dc1902 |
@@ -78,6 +78,7 @@ extern void sh_iorestore(Shell_t*,int,i
|
|
|
dc1902 |
extern Sfio_t *sh_iostream(Shell_t*,int);
|
|
|
dc1902 |
extern int sh_redirect(Shell_t*,struct ionod*,int);
|
|
|
dc1902 |
extern void sh_iosave(Shell_t *, int,int,char*);
|
|
|
dc1902 |
+extern int safefdnumber(Shell_t* shp, int sfd);
|
|
|
dc1902 |
extern int sh_iovalidfd(Shell_t*, int);
|
|
|
dc1902 |
extern int sh_inuse(Shell_t*, int);
|
|
|
dc1902 |
extern void sh_iounsave(Shell_t*);
|
|
|
dc1902 |
diff -up ksh-20120801/src/cmd/ksh93/sh/io.c.safefd ksh-20120801/src/cmd/ksh93/sh/io.c
|
|
|
dc1902 |
--- ksh-20120801/src/cmd/ksh93/sh/io.c.safefd 2015-03-03 18:21:40.511732421 +0100
|
|
|
dc1902 |
+++ ksh-20120801/src/cmd/ksh93/sh/io.c 2015-03-03 18:21:40.544732158 +0100
|
|
|
dc1902 |
@@ -1724,6 +1724,25 @@ void sh_iosave(Shell_t *shp, register in
|
|
|
dc1902 |
}
|
|
|
dc1902 |
}
|
|
|
dc1902 |
|
|
|
dc1902 |
+int safefdnumber(Shell_t* shp, int sfd)
|
|
|
dc1902 |
+{
|
|
|
dc1902 |
+ register int fd;
|
|
|
dc1902 |
+
|
|
|
dc1902 |
+ while(1)
|
|
|
dc1902 |
+ {
|
|
|
dc1902 |
+ for(fd=0; fd < shp->topfd; fd++)
|
|
|
dc1902 |
+ {
|
|
|
dc1902 |
+ if (filemap[fd].save_fd==sfd || filemap[fd].orig_fd==sfd || (fcntl(sfd, F_GETFD) != -1 || errno != EBADF))
|
|
|
dc1902 |
+ {
|
|
|
dc1902 |
+ sfd++;
|
|
|
dc1902 |
+ continue;
|
|
|
dc1902 |
+ }
|
|
|
dc1902 |
+ }
|
|
|
dc1902 |
+ break;
|
|
|
dc1902 |
+ }
|
|
|
dc1902 |
+ return sfd;
|
|
|
dc1902 |
+}
|
|
|
dc1902 |
+
|
|
|
dc1902 |
/*
|
|
|
dc1902 |
* close all saved file descriptors
|
|
|
dc1902 |
*/
|
|
|
dc1902 |
diff -up ksh-20120801/src/cmd/ksh93/sh/subshell.c.safefd ksh-20120801/src/cmd/ksh93/sh/subshell.c
|
|
|
dc1902 |
--- ksh-20120801/src/cmd/ksh93/sh/subshell.c.safefd 2015-03-03 18:21:40.531732261 +0100
|
|
|
dc1902 |
+++ ksh-20120801/src/cmd/ksh93/sh/subshell.c 2015-03-03 18:21:40.544732158 +0100
|
|
|
dc1902 |
@@ -673,7 +673,7 @@ Sfio_t *sh_subshell(Shell_t *shp,Shnode_
|
|
|
dc1902 |
}
|
|
|
dc1902 |
if(iop && sffileno(iop)==1)
|
|
|
dc1902 |
{
|
|
|
dc1902 |
- int fd=sfsetfd(iop,3);
|
|
|
dc1902 |
+ int fd=sfsetfd(iop,safefdnumber(shp,3));
|
|
|
dc1902 |
if(fd<0)
|
|
|
dc1902 |
{
|
|
|
dc1902 |
shp->toomany = 1;
|