about summary refs log tree commit diff
path: root/src/process
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-12-05 21:19:39 -0500
committerRich Felker <dalias@aerifal.cx>2014-12-05 21:19:39 -0500
commit8f7bc690f07e90177b176b6e19736ad7c1d49840 (patch)
tree06f4886843fe4f623a6d5ca7dec851434d7d7170 /src/process
parent1c12c24364d1058ffdbb28fca72a51de85082778 (diff)
downloadmusl-8f7bc690f07e90177b176b6e19736ad7c1d49840.tar.gz
musl-8f7bc690f07e90177b176b6e19736ad7c1d49840.tar.xz
musl-8f7bc690f07e90177b176b6e19736ad7c1d49840.zip
use direct syscall rather than write function in posix_spawn child
the write function is a cancellation point and accesses thread-local
state belonging to the calling thread in the parent process. since
cancellation is blocked for the duration of posix_spawn, this is
probably safe, but it's fragile and unnecessary. making the syscall
directly is just as easy and clearly safe.
Diffstat (limited to 'src/process')
-rw-r--r--src/process/posix_spawn.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/process/posix_spawn.c b/src/process/posix_spawn.c
index af127317..0bdf71cd 100644
--- a/src/process/posix_spawn.c
+++ b/src/process/posix_spawn.c
@@ -136,7 +136,7 @@ static int child(void *args_vp)
 fail:
 	/* Since sizeof errno < PIPE_BUF, the write is atomic. */
 	ret = -ret;
-	if (ret) while (write(p, &ret, sizeof ret) < 0);
+	if (ret) while (__syscall(SYS_write, p, &ret, sizeof ret) < 0);
 	_exit(127);
 }