s390: fix syscall_get_error for compat processes
PATCH 1/1 s390: fix syscall_get_error for compat processes
If both the tracer and the tracee are compat processes, and gprs[2] is assigned a value by __poke_user_compat, then the higher 32 bits of gprs[2] are cleared, IS_ERR_VALUE() always returns false, and syscall_get_error() always returns 0.
Fix the implementation by sign-extending the value for compat processes the same way as x86 implementation does.
The bug was exposed to user space by commit 201766a20e30f ("ptrace: add PTRACE_GET_SYSCALL_INFO request") and detected by strace test suite.
This change fixes strace syscall tampering on s390.
--- arch/s390/include/asm/syscall.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
arch/s390/include/asm/syscall.h +11 -1
@@ -33,7 +33,17 @@ static inline void syscall_rollback(struct task_struct *task,static inline long syscall_get_error (struct task_struct *task,struct pt_regs *regs) { -return IS_ERR_VALUE (regs->gprs[2 ]) ? regs->gprs[2 ] :0 ; +unsigned long error = regs->gprs[2 ]; +#ifdef CONFIG_COMPAT +if (test_tsk_thread_flag (task,TIF_31BIT )) { +/* +* Sign-extend the value so (int)-EFOO becomes (long)-EFOO +* and will match correctly in comparisons. +*/ + error = (long ) (int ) error; + } +#endif +return IS_ERR_VALUE (error) ? error :0 ; } static inline long syscall_get_return_value(struct task_struct *task,
Signature · 1 line
ldv
Heiko Carstens
AppliedQuoted 13 lines · Dmitry V. Levin
If both the tracer and the tracee are compat processes, and gprs[2] is assigned a value by
__poke_user_compat, then the higher 32 bits of gprs[2] are cleared,IS_ERR_VALUE()always returns false, andsyscall_get_error()always returns 0.Fix the implementation by sign-extending the value for compat processes the same way as x86 implementation does.
The bug was exposed to user space by commit
201766a20e30f("ptrace: addPTRACE_GET_SYSCALL_INFOrequest") and detected by strace test suite.This change fixes strace syscall tampering on s390.
Quoted 7 lines
Fixes 753c4dd6a2fa2 ("[S390] ptrace changes")Cc Elvira Khabirova <[email protected]>Cc [email protected] # v2.6.28+Signed-off-by Dmitry V. Levin <[email protected]>--- arch/s390/include/asm/syscall.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
Applied, thank you!