From 622804ece745732da0998ec45a2931d94f9dcb4e Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Wed, 6 Apr 2011 19:46:46 -0400 Subject: fix rsyscall handler: must not clobber errno from signal context --- src/thread/pthread_create.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/thread/pthread_create.c') 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); -- cgit v1.2.1