diff options
| author | Rich Felker <dalias@aerifal.cx> | 2011-04-06 19:46:46 -0400 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2011-04-06 19:46:46 -0400 | 
| commit | 622804ece745732da0998ec45a2931d94f9dcb4e (patch) | |
| tree | a323b15701fbf508312edfba3d0effe787836af2 | |
| parent | 095ad156734a5a082e8717e59d76d75db286827c (diff) | |
| download | musl-622804ece745732da0998ec45a2931d94f9dcb4e.tar.gz | |
fix rsyscall handler: must not clobber errno from signal context
| -rw-r--r-- | src/thread/pthread_create.c | 6 | 
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); | 
