From cffb9e1ee2a5e8925845f0c9b79cb6c80487302c Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 16 Sep 2013 11:52:39 -0400 Subject: [PATCH] fix clobbering of caller's stack in mips __clone function 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 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/thread/mips/clone.s b/src/thread/mips/clone.s index 6c2e7908..37dddf57 100644 --- a/src/thread/mips/clone.s +++ b/src/thread/mips/clone.s @@ -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) -- 2.25.1