Browse Source

arm: clone: restore stack pointer just after return from syscall

If the syscall returns with an error the stack pointer and r4 register
are not restored because the instruction 'ldmnefd sp!, {r4}' is executed
after branching to '__error' label.
This bug has been spotted out by running './utstest clone 5' from LTP
built with -fstack-protector-all compiler flag as log below:

root@cortex-a9:/usr/tests/ltp/testcases/bin# ./utstest clone 5
stack smashing detected: ./utstest terminated()

Regression introduced by commit e58798e107d652644629a1daaa95d76430808d53

Signed-off-by: Filippo Arcidiacono <filippo.arcidiacono@st.com>
Signed-off-by: Giuseppe Di Giore <giuseppe.di-giore@st.com>
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
Filippo Arcidiacono 12 years ago
parent
commit
495c425c3b
1 changed files with 1 additions and 1 deletions
  1. 1 1
      libc/sysdeps/linux/arm/clone.S

+ 1 - 1
libc/sysdeps/linux/arm/clone.S

@@ -110,8 +110,8 @@ __clone:
 	ldr	r4, [sp, #12]
 	DO_CALL (clone)
 	movs	a1, a1
-	blt	__error
 	ldmnefd	sp!, {r4}
+	blt	__error
 	IT(t, ne)
 #if defined(__USE_BX__)
 	bxne	lr