summaryrefslogtreecommitdiff
path: root/src/thread
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-04-06 19:46:46 -0400
committerRich Felker <dalias@aerifal.cx>2011-04-06 19:46:46 -0400
commit622804ece745732da0998ec45a2931d94f9dcb4e (patch)
treea323b15701fbf508312edfba3d0effe787836af2 /src/thread
parent095ad156734a5a082e8717e59d76d75db286827c (diff)
downloadmusl-622804ece745732da0998ec45a2931d94f9dcb4e.tar.gz
musl-622804ece745732da0998ec45a2931d94f9dcb4e.tar.bz2
musl-622804ece745732da0998ec45a2931d94f9dcb4e.tar.xz
musl-622804ece745732da0998ec45a2931d94f9dcb4e.zip
fix rsyscall handler: must not clobber errno from signal context
Diffstat (limited to 'src/thread')
-rw-r--r--src/thread/pthread_create.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c
index 52487001..410eefc2 100644
--- a/src/thread/pthread_create.c
+++ b/src/thread/pthread_create.c
@@ -89,6 +89,7 @@ static struct {
static void rsyscall_handler(int sig, siginfo_t *si, void *ctx)
{
struct pthread *self = __pthread_self();
+ long r;
if (!rs.hold || rs.cnt == libc.threads_minus_1) return;
@@ -99,8 +100,9 @@ static void rsyscall_handler(int sig, siginfo_t *si, void *ctx)
return;
}
- if (syscall(rs.nr, rs.arg[0], rs.arg[1], rs.arg[2],
- rs.arg[3], rs.arg[4], rs.arg[5]) < 0 && !rs.err) rs.err=errno;
+ r = __syscall(rs.nr, rs.arg[0], rs.arg[1],
+ rs.arg[2], rs.arg[3], rs.arg[4], rs.arg[5]);
+ if (r < 0) rs.err=-r;
a_inc(&rs.cnt);
__wake(&rs.cnt, 1, 1);