libthread: use devdup instead of mounting pipe to /mnt/temp for close-on-exec in procexec()
the namespace might be shared by other processes. instead, we create a anonymous pipe with pipe() and use devdup to open one end close-on-exec. this is shorter and avoids the race condition. do not touch Execargs after writing the error message as the process might be gone after the write. this was to manually close the fd which isnt neccesary as the kernel will do it for us on the following exit.
This commit is contained in:
parent
1d2ce3583e
commit
45d1d31847
3 changed files with 6 additions and 16 deletions
|
@ -356,11 +356,6 @@ can safely free it once they have
|
|||
received the
|
||||
.I cpid
|
||||
response.
|
||||
Note that the mount point
|
||||
.B /mnt/temp
|
||||
must exist;
|
||||
.I procexec(l)
|
||||
mount pipes there.
|
||||
.PP
|
||||
.I Threadwaitchan
|
||||
returns a channel of pointers to
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
#include <thread.h>
|
||||
#include "threadimpl.h"
|
||||
|
||||
#define PIPEMNT "/mnt/temp"
|
||||
|
||||
void
|
||||
procexec(Channel *pidc, char *prog, char *args[])
|
||||
{
|
||||
|
@ -36,18 +34,16 @@ procexec(Channel *pidc, char *prog, char *args[])
|
|||
* then the proc doing the exec sends the errstr down the
|
||||
* pipe to us.
|
||||
*/
|
||||
if(bind("#|", PIPEMNT, MREPL) < 0)
|
||||
if(pipe(p->exec.fd) < 0)
|
||||
goto Bad;
|
||||
if((p->exec.fd[0] = open(PIPEMNT "/data", OREAD)) < 0){
|
||||
unmount(nil, PIPEMNT);
|
||||
goto Bad;
|
||||
}
|
||||
if((p->exec.fd[1] = open(PIPEMNT "/data1", OWRITE|OCEXEC)) < 0){
|
||||
snprint(p->exitstr, ERRMAX, "/fd/%d", p->exec.fd[1]);
|
||||
if((n = open(p->exitstr, OWRITE|OCEXEC)) < 0){
|
||||
close(p->exec.fd[0]);
|
||||
unmount(nil, PIPEMNT);
|
||||
close(p->exec.fd[1]);
|
||||
goto Bad;
|
||||
}
|
||||
unmount(nil, PIPEMNT);
|
||||
close(p->exec.fd[1]);
|
||||
p->exec.fd[1] = n;
|
||||
|
||||
/* exec in parallel via the scheduler */
|
||||
assert(p->needexec==0);
|
||||
|
|
|
@ -114,7 +114,6 @@ efork(Execargs *e)
|
|||
if(buf[0]=='\0')
|
||||
strcpy(buf, "exec failed");
|
||||
write(e->fd[1], buf, strlen(buf));
|
||||
close(e->fd[1]);
|
||||
_exits(buf);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue