fix clobbering of caller's stack in mips __clone function
authorRich Felker <dalias@aerifal.cx>
Mon, 16 Sep 2013 15:52:39 +0000 (11:52 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 16 Sep 2013 15:52:39 +0000 (11:52 -0400)
this was resulting in crashes in posix_spawn on mips, and would have
affected applications calling clone too. since the prototype for
__clone has it as a variadic function, it may not assume that 16($sp)
is writable for use in making the syscall. instead, it needs to
allocate additional stack space, and then adjust the stack pointer
back in both of the code paths for the parent process/thread.

src/thread/mips/clone.s

index 6c2e7908385f23d062fc155e1b2115cec59adbc2..37dddf57ba9575c9e849b03ad195b0caea1ddf4a 100644 (file)
@@ -12,15 +12,18 @@ __clone:
        lw $6, 16($sp)
        lw $7, 20($sp)
        lw $9, 24($sp)
+       subu $sp, $sp, 16
        sw $9, 16($sp)
        li $2, 4120
        syscall
        beq $7, $0, 1f
        nop
+       addu $sp, $sp, 16
        jr $ra
        subu $2, $0, $2
 1:     beq $2, $0, 1f
        nop
+       addu $sp, $sp, 16
        jr $ra
        nop
 1:     lw $25, 0($sp)