فهرست منبع

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.
Rich Felker 11 سال پیش
والد
کامیت
cffb9e1ee2
1فایلهای تغییر یافته به همراه3 افزوده شده و 0 حذف شده
  1. 3 0
      src/thread/mips/clone.s

+ 3 - 0
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)