Enable ptrace intercept on powerpc.
Tested on ppc64 and ppc64le.
This commit is contained in:
@@ -58,9 +58,9 @@ static inline void
|
|||||||
set_sc_retval(struct sudo_ptrace_regs *regs, int retval)
|
set_sc_retval(struct sudo_ptrace_regs *regs, int retval)
|
||||||
{
|
{
|
||||||
if (regs->compat) {
|
if (regs->compat) {
|
||||||
compat_reg_retval(regs->u.compat) = retval;
|
compat_reg_set_retval(regs->u.compat, retval);
|
||||||
} else {
|
} else {
|
||||||
reg_retval(regs->u.native) = retval;
|
reg_set_retval(regs->u.native, retval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ get_stack_pointer(struct sudo_ptrace_regs *regs)
|
|||||||
static inline void
|
static inline void
|
||||||
set_sc_retval(struct sudo_ptrace_regs *regs, int retval)
|
set_sc_retval(struct sudo_ptrace_regs *regs, int retval)
|
||||||
{
|
{
|
||||||
reg_retval(regs->u.native) = retval;
|
reg_set_retval(regs->u.native, retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
|
@@ -107,32 +107,37 @@
|
|||||||
# define reg_arg2(x) (x).ecx
|
# define reg_arg2(x) (x).ecx
|
||||||
# define reg_arg3(x) (x).edx
|
# define reg_arg3(x) (x).edx
|
||||||
# define reg_arg4(x) (x).esi
|
# define reg_arg4(x) (x).esi
|
||||||
#elif defined(__powerpc64__)
|
#elif defined(__powerpc__)
|
||||||
/* Untested */
|
# if defined(__powerpc64__)
|
||||||
# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_PPC64LE
|
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_PPC64LE
|
||||||
|
# else
|
||||||
|
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_PPC64
|
||||||
|
# endif
|
||||||
# else
|
# else
|
||||||
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_PPC64
|
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_PPC
|
||||||
# endif
|
# endif
|
||||||
# define user_pt_regs pt_regs
|
# define user_pt_regs pt_regs
|
||||||
# define reg_syscall(x) (x).gpr[0] /* r0 */
|
# define reg_syscall(x) (x).gpr[0] /* r0 */
|
||||||
# define reg_retval(x) (x).gpr[3] /* r3 */
|
# define reg_retval(x) (x).gpr[3] /* r3 */
|
||||||
# define reg_sp(x) (x).gpr[1] /* r1 */
|
# define reg_sp(x) (x).gpr[1] /* r1 */
|
||||||
# define reg_arg1(x) (x).gpr[3] /* r3 */
|
# define reg_arg1(x) (x).orig_gpr3 /* r3 */
|
||||||
# define reg_arg2(x) (x).gpr[4] /* r4 */
|
|
||||||
# define reg_arg3(x) (x).gpr[5] /* r5 */
|
|
||||||
# define reg_arg4(x) (x).gpr[6] /* r6 */
|
|
||||||
#elif defined(__powerpc__)
|
|
||||||
/* Untested */
|
|
||||||
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_PPC
|
|
||||||
# define user_pt_regs pt_regs
|
|
||||||
# define reg_syscall(x) (x).gpr[0] /* r0 */
|
|
||||||
# define reg_retval(x) (x).gpr[3] /* r3 */
|
|
||||||
# define reg_sp(x) (x).gpr[1] /* r1 */
|
|
||||||
# define reg_arg1(x) (x).gpr[3] /* r3 */
|
|
||||||
# define reg_arg2(x) (x).gpr[4] /* r4 */
|
# define reg_arg2(x) (x).gpr[4] /* r4 */
|
||||||
# define reg_arg3(x) (x).gpr[5] /* r5 */
|
# define reg_arg3(x) (x).gpr[5] /* r5 */
|
||||||
# define reg_arg4(x) (x).gpr[6] /* r6 */
|
# define reg_arg4(x) (x).gpr[6] /* r6 */
|
||||||
|
# define reg_set_retval(_r, _v) do { \
|
||||||
|
if (((_r).trap & 0xfff0) == 0x3000) { \
|
||||||
|
/* scv 0 system call, uses negative error code for result. */ \
|
||||||
|
reg_retval(_r) = (_v); \
|
||||||
|
} else { \
|
||||||
|
/* \
|
||||||
|
* Set CR0 SO bit to indicate a syscall error, which is stored \
|
||||||
|
* as a positive error code. \
|
||||||
|
*/ \
|
||||||
|
reg_retval(_r) = -(_v); \
|
||||||
|
(_r).ccr |= 0x10000000; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
#elif defined(__riscv) && __riscv_xlen == 64
|
#elif defined(__riscv) && __riscv_xlen == 64
|
||||||
/* Untested */
|
/* Untested */
|
||||||
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_RISCV64
|
# define SECCOMP_AUDIT_ARCH AUDIT_ARCH_RISCV64
|
||||||
@@ -208,7 +213,7 @@ struct i386_user_regs_struct {
|
|||||||
# define compat_reg_arg2(x) (x).ecx
|
# define compat_reg_arg2(x) (x).ecx
|
||||||
# define compat_reg_arg3(x) (x).edx
|
# define compat_reg_arg3(x) (x).edx
|
||||||
# define compat_reg_arg4(x) (x).esi
|
# define compat_reg_arg4(x) (x).esi
|
||||||
#elif defined(__arm__)
|
#elif defined(__aarch64__)
|
||||||
struct arm_pt_regs {
|
struct arm_pt_regs {
|
||||||
unsigned int uregs[18];
|
unsigned int uregs[18];
|
||||||
};
|
};
|
||||||
@@ -223,6 +228,51 @@ struct arm_pt_regs {
|
|||||||
# define compat_reg_arg2(x) (x).uregs[1] /* r1 */
|
# define compat_reg_arg2(x) (x).uregs[1] /* r1 */
|
||||||
# define compat_reg_arg3(x) (x).uregs[2] /* r2 */
|
# define compat_reg_arg3(x) (x).uregs[2] /* r2 */
|
||||||
# define compat_reg_arg4(x) (x).uregs[3] /* r3 */
|
# define compat_reg_arg4(x) (x).uregs[3] /* r3 */
|
||||||
|
#elif defined(__powerpc64__)
|
||||||
|
struct ppc_pt_regs {
|
||||||
|
unsigned int gpr[32];
|
||||||
|
unsigned int nip;
|
||||||
|
unsigned int msr;
|
||||||
|
unsigned int orig_gpr3;
|
||||||
|
unsigned int ctr;
|
||||||
|
unsigned int link;
|
||||||
|
unsigned int xer;
|
||||||
|
unsigned int ccr;
|
||||||
|
unsigned int mq;
|
||||||
|
unsigned int trap;
|
||||||
|
unsigned int dar;
|
||||||
|
unsigned int dsisr;
|
||||||
|
unsigned int result;
|
||||||
|
};
|
||||||
|
# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
|
/* There is no AUDIT_ARCH_PPCLE define. */
|
||||||
|
# define SECCOMP_AUDIT_ARCH_COMPAT (AUDIT_ARCH_PPC|__AUDIT_ARCH_LE)
|
||||||
|
# else
|
||||||
|
# define SECCOMP_AUDIT_ARCH_COMPAT AUDIT_ARCH_PPC
|
||||||
|
# endif
|
||||||
|
# define COMPAT_execve __NR_execve
|
||||||
|
# define COMPAT_execveat __NR_execveat
|
||||||
|
# define compat_user_pt_regs ppc_pt_regs
|
||||||
|
# define compat_reg_syscall(x) (x).gpr[0] /* r0 */
|
||||||
|
# define compat_reg_retval(x) (x).gpr[3] /* r3 */
|
||||||
|
# define compat_reg_sp(x) (x).gpr[1] /* r1 */
|
||||||
|
# define compat_reg_arg1(x) (x).orig_gpr3 /* r3 */
|
||||||
|
# define compat_reg_arg2(x) (x).gpr[4] /* r4 */
|
||||||
|
# define compat_reg_arg3(x) (x).gpr[5] /* r5 */
|
||||||
|
# define compat_reg_arg4(x) (x).gpr[6] /* r6 */
|
||||||
|
# define compat_reg_set_retval(_r, _v) reg_set_retval(_r, _v)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set the syscall return value the "normal" way by default. */
|
||||||
|
#ifndef reg_set_retval
|
||||||
|
# define reg_set_retval(_r, _v) do { \
|
||||||
|
reg_retval(_r) = (_v); \
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
#ifndef compat_reg_set_retval
|
||||||
|
# define compat_reg_set_retval(_r, _v) do { \
|
||||||
|
compat_reg_retval(_r) = (_v); \
|
||||||
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct sudo_ptrace_regs {
|
struct sudo_ptrace_regs {
|
||||||
|
@@ -96,7 +96,7 @@ union sudo_token_un {
|
|||||||
*/
|
*/
|
||||||
#if defined(_PATH_SUDO_INTERCEPT) && defined(__linux__)
|
#if defined(_PATH_SUDO_INTERCEPT) && defined(__linux__)
|
||||||
# if defined(HAVE_DECL_SECCOMP_SET_MODE_FILTER) && HAVE_DECL_SECCOMP_SET_MODE_FILTER
|
# if defined(HAVE_DECL_SECCOMP_SET_MODE_FILTER) && HAVE_DECL_SECCOMP_SET_MODE_FILTER
|
||||||
# if defined(__amd64__) || defined(__i386__) || defined(__aarch64__)
|
# if defined(__amd64__) || defined(__i386__) || defined(__aarch64__) || defined(__powerpc__)
|
||||||
# ifndef HAVE_PTRACE_INTERCEPT
|
# ifndef HAVE_PTRACE_INTERCEPT
|
||||||
# define HAVE_PTRACE_INTERCEPT 1
|
# define HAVE_PTRACE_INTERCEPT 1
|
||||||
# endif /* HAVE_PTRACE_INTERCEPT */
|
# endif /* HAVE_PTRACE_INTERCEPT */
|
||||||
|
Reference in New Issue
Block a user