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.
front
cinap_lenrek 2015-02-28 12:50:17 +01:00
parent 1d2ce3583e
commit 45d1d31847
3 changed files with 6 additions and 16 deletions

View File

@ -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

View File

@ -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);

View File

@ -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);
}