Browse Source

fix rsyscall handler: must not clobber errno from signal context

Rich Felker 14 years ago
parent
commit
622804ece7
1 changed files with 4 additions and 2 deletions
  1. 4 2
      src/thread/pthread_create.c

+ 4 - 2
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);