diff --git a/src/exec_ptrace.h b/src/exec_ptrace.h index cde600080..c1da00f1e 100644 --- a/src/exec_ptrace.h +++ b/src/exec_ptrace.h @@ -196,29 +196,21 @@ # define reg_arg2(x) (x).a1 # define reg_arg3(x) (x).a2 # define reg_arg4(x) (x).a3 -#elif defined(__s390x__) -/* Untested/incomplete. - * s390x may not support setting the system call return via ptrace. - */ -# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_S390X -# define sudo_pt_regs s390_regs -# define reg_syscall(x) (x).gprs[1] /* r1 */ -# define reg_retval(x) (x).gprs[2] /* r2 */ -# define reg_sp(x) (x).gprs[15] /* r15 */ -# define reg_arg1(x) (x).gprs[2] /* r2 */ -# define reg_arg2(x) (x).gprs[3] /* r3 */ -# define reg_arg3(x) (x).gprs[4] /* r4 */ -# define reg_arg4(x) (x).gprs[5] /* r6 */ #elif defined(__s390__) -/* Untested/incomplete. - * s390 may not support setting the system call return via ptrace. +/* + * Both the syscall number and return value are stored in r2 for + * the s390 ptrace API. The first argument is stored in orig_gpr2. */ -# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_S390 +# if defined(__s390x__) +# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_S390X +# else +# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_S390 +# endif # define sudo_pt_regs s390_regs -# define reg_syscall(x) (x).gprs[1] /* r1 */ +# define reg_syscall(x) (x).gprs[2] /* r2 */ # define reg_retval(x) (x).gprs[2] /* r2 */ # define reg_sp(x) (x).gprs[15] /* r15 */ -# define reg_arg1(x) (x).gprs[2] /* r2 */ +# define reg_arg1(x) (x).orig_gpr2 /* r2 */ # define reg_arg2(x) (x).gprs[3] /* r3 */ # define reg_arg3(x) (x).gprs[4] /* r4 */ # define reg_arg4(x) (x).gprs[5] /* r6 */ diff --git a/src/sudo_exec.h b/src/sudo_exec.h index e1b301170..a2eb8e9c4 100644 --- a/src/sudo_exec.h +++ b/src/sudo_exec.h @@ -96,7 +96,7 @@ union sudo_token_un { */ #if defined(_PATH_SUDO_INTERCEPT) && defined(__linux__) # if defined(HAVE_DECL_SECCOMP_SET_MODE_FILTER) && HAVE_DECL_SECCOMP_SET_MODE_FILTER -# if defined(__amd64__) || defined(__i386__) || defined(__aarch64__) || defined(__arm__) || defined(__powerpc__) || (defined(__riscv) && __riscv_xlen == 64) +# if defined(__amd64__) || defined(__i386__) || defined(__aarch64__) || defined(__arm__) || defined(__powerpc__) || (defined(__riscv) && __riscv_xlen == 64) || defined(__s390__) # ifndef HAVE_PTRACE_INTERCEPT # define HAVE_PTRACE_INTERCEPT 1 # endif /* HAVE_PTRACE_INTERCEPT */