summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/arm
diff options
context:
space:
mode:
authorFilippo Arcidiacono <filippo.arcidiacono@st.com>2012-12-10 09:50:52 +0100
committerCarmelo Amoroso <carmelo.amoroso@st.com>2012-12-11 16:39:22 +0100
commit495c425c3b10fd9e277995fa2a379ba4a62f78bf (patch)
treef18e2ec5840617a372dfb9597d982447579c46b4 /libc/sysdeps/linux/arm
parentf4b1b7ade7971141aa3bf731894053696b0ca4e9 (diff)
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>
Diffstat (limited to 'libc/sysdeps/linux/arm')
-rw-r--r--libc/sysdeps/linux/arm/clone.S2
1 files changed, 1 insertions, 1 deletions
diff --git a/libc/sysdeps/linux/arm/clone.S b/libc/sysdeps/linux/arm/clone.S
index 33b10411d..98dde2210 100644
--- a/libc/sysdeps/linux/arm/clone.S
+++ b/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