fix bugs in cancellable syscall asm
authorRich Felker <dalias@aerifal.cx>
Sun, 17 Apr 2011 19:30:08 +0000 (15:30 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 17 Apr 2011 19:30:08 +0000 (15:30 -0400)
commit09dae2b7b66f741b30aa7ce95ab395239da20762
treeda94ed95c914ec60663aec3368e3642d8c41cfeb
parentebf82447be4b30bedc19ad868c3a0662b1ba596d
fix bugs in cancellable syscall asm

x86_64 was just plain wrong in the cancel-flag-already-set path, and
crashing.

the more subtle error was not clearing the saved stack pointer before
returning to c code. this could result in the signal handler
misidentifying c code as the pre-syscall part of the asm, and acting
on cancellation at the wrong time, and thus resource leak race
conditions.

also, now __cancel (in the c code) is responsible for clearing the
saved sp in the already-cancelled branch. this means we have to use
call rather than jmp to ensure the stack pointer in the c will never
match what the asm saved.
src/thread/cancel_impl.c
src/thread/i386/syscall_cp.s
src/thread/x86_64/syscall_cp.s