]> granicus.if.org Git - musl/commitdiff
fix crash in x32 sigsetjmp
authorRich Felker <dalias@aerifal.cx>
Sat, 2 May 2015 15:57:20 +0000 (11:57 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 2 May 2015 15:57:20 +0000 (11:57 -0400)
the 64-bit push reads not only the 32-bit return address but also the
first 32 signal mask bits. if any were nonzero, the return address
obtained will be invalid.

at some point storage of the return address should probably be moved
to follow the saved mask so that there's plenty room and the same code
can be used on x32 and regular x86_64, but for now I want a fix that
does not risk breaking x86_64, and this simple re-zeroing works.

src/signal/x32/sigsetjmp.s

index 9a7695f96dc951d6c531f0b580bb71c21fa79ce8..1f02b0e502822cb3a10e3b0affc48e639bee1670 100644 (file)
@@ -14,6 +14,7 @@ __sigsetjmp:
        call setjmp@PLT
 
        pushq 64(%rbx)
+       movl $0, 4(%rsp)
        mov %rbx,%rdi
        mov %eax,%esi
        mov 72+8(%rbx),%rbx