git: 9front

Download patch

ref: 25e2b593f814d15704a796e0268f340583a47194
parent: ed035ae1730f79db6c179b75db60e716a08dab02
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Feb 28 07:50:17 EST 2015

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.

--- a/sys/man/2/thread
+++ b/sys/man/2/thread
@@ -356,11 +356,6 @@
 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
--- a/sys/src/libthread/exec.c
+++ b/sys/src/libthread/exec.c
@@ -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 @@
 	 * 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);
--- a/sys/src/libthread/main.c
+++ b/sys/src/libthread/main.c
@@ -114,7 +114,6 @@
 	if(buf[0]=='\0')
 		strcpy(buf, "exec failed");
 	write(e->fd[1], buf, strlen(buf));
-	close(e->fd[1]);
 	_exits(buf);
 }
 
--