Module Name: src Committed By: christos Date: Sun Dec 17 20:59:28 UTC 2017
Modified Files: src/sys/compat/netbsd32: netbsd32.h netbsd32_ptrace.c netbsd32_signal.c src/sys/kern: sys_ptrace.c sys_ptrace_common.c src/sys/sys: ptrace.h Log Message: handle siginfo requests for ptrace32 To generate a diff of this commit: cvs rdiff -u -r1.114 -r1.115 src/sys/compat/netbsd32/netbsd32.h cvs rdiff -u -r1.4 -r1.5 src/sys/compat/netbsd32/netbsd32_ptrace.c cvs rdiff -u -r1.44 -r1.45 src/sys/compat/netbsd32/netbsd32_signal.c cvs rdiff -u -r1.4 -r1.5 src/sys/kern/sys_ptrace.c cvs rdiff -u -r1.28 -r1.29 src/sys/kern/sys_ptrace_common.c cvs rdiff -u -r1.61 -r1.62 src/sys/sys/ptrace.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/netbsd32/netbsd32.h diff -u src/sys/compat/netbsd32/netbsd32.h:1.114 src/sys/compat/netbsd32/netbsd32.h:1.115 --- src/sys/compat/netbsd32/netbsd32.h:1.114 Sun Nov 13 08:52:41 2016 +++ src/sys/compat/netbsd32/netbsd32.h Sun Dec 17 15:59:27 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32.h,v 1.114 2016/11/13 13:52:41 rin Exp $ */ +/* $NetBSD: netbsd32.h,v 1.115 2017/12/17 20:59:27 christos Exp $ */ /* * Copyright (c) 1998, 2001, 2008, 2015 Matthew R. Green @@ -292,6 +292,13 @@ struct netbsd32_ptrace_io_desc { actual count (out) */ }; +struct netbsd32_ptrace_siginfo { + siginfo32_t psi_siginfo; /* signal information structure */ + lwpid_t psi_lwpid; /* destination LWP of the signal + * value 0 means the whole process + * (route signal to all LWPs) */ +}; + /* from <sys/quotactl.h> */ typedef netbsd32_pointer_t netbsd32_quotactlargsp_t; struct netbsd32_quotactlargs { @@ -1121,6 +1128,8 @@ vaddr_t netbsd32_vm_default_addr(struct void netbsd32_adjust_limits(struct proc *); void netbsd32_si_to_si32(siginfo32_t *, const siginfo_t *); +void netbsd32_si32_to_si(siginfo_t *, const siginfo32_t *); + void netbsd32_ksi32_to_ksi(struct _ksiginfo *si, const struct __ksiginfo32 *si32); #ifdef KTRACE Index: src/sys/compat/netbsd32/netbsd32_ptrace.c diff -u src/sys/compat/netbsd32/netbsd32_ptrace.c:1.4 src/sys/compat/netbsd32/netbsd32_ptrace.c:1.5 --- src/sys/compat/netbsd32/netbsd32_ptrace.c:1.4 Wed Feb 22 22:34:22 2017 +++ src/sys/compat/netbsd32/netbsd32_ptrace.c Sun Dec 17 15:59:27 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32_ptrace.c,v 1.4 2017/02/23 03:34:22 kamil Exp $ */ +/* $NetBSD: netbsd32_ptrace.c,v 1.5 2017/12/17 20:59:27 christos Exp $ */ /* * Copyright (c) 2016 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: netbsd32_ptrace.c,v 1.4 2017/02/23 03:34:22 kamil Exp $"); +__KERNEL_RCSID(0, "$NetBSD: netbsd32_ptrace.c,v 1.5 2017/12/17 20:59:27 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_ptrace.h" @@ -54,18 +54,14 @@ extern struct emul emul_netbsd32; * PTRACE methods */ -static int netbsd32_copyinpiod(struct ptrace_io_desc *, const void *); -static void netbsd32_copyoutpiod(const struct ptrace_io_desc *, void *); -static int netbsd32_doregs(struct lwp *, struct lwp *, struct uio *); -static int netbsd32_dofpregs(struct lwp *, struct lwp *, struct uio *); -static int netbsd32_dodbregs(struct lwp *, struct lwp *, struct uio *); - - static int -netbsd32_copyinpiod(struct ptrace_io_desc *piod, const void *addr) +netbsd32_copyin_piod(struct ptrace_io_desc *piod, const void *addr, size_t len) { struct netbsd32_ptrace_io_desc piod32; + if (len != 0 && sizeof(piod32) != len) + return EINVAL; + int error = copyin(addr, &piod32, sizeof(piod32)); if (error) return error; @@ -77,18 +73,49 @@ netbsd32_copyinpiod(struct ptrace_io_des return 0; } -static void -netbsd32_copyoutpiod(const struct ptrace_io_desc *piod, void *addr) +static int +netbsd32_copyout_piod(const struct ptrace_io_desc *piod, void *addr, size_t len) { struct netbsd32_ptrace_io_desc piod32; + if (len != 0 && sizeof(piod32) != len) + return EINVAL; + piod32.piod_op = piod->piod_op; NETBSD32PTR32(piod32.piod_offs, piod->piod_offs); NETBSD32PTR32(piod32.piod_addr, piod->piod_addr); piod32.piod_len = (netbsd32_size_t)piod->piod_len; - (void) copyout(&piod32, addr, sizeof(piod32)); + return copyout(&piod32, addr, sizeof(piod32)); } +static int +netbsd32_copyin_siginfo(struct ptrace_siginfo *psi, const void *addr, size_t len) +{ + struct netbsd32_ptrace_siginfo psi32; + + if (sizeof(psi32) != len) + return EINVAL; + + int error = copyin(addr, &psi32, sizeof(psi32)); + if (error) + return error; + psi->psi_lwpid = psi32.psi_lwpid; + netbsd32_si32_to_si(&psi->psi_siginfo, &psi32.psi_siginfo); + return 0; +} + +static int +netbsd32_copyout_siginfo(const struct ptrace_siginfo *psi, void *addr, size_t len) +{ + struct netbsd32_ptrace_siginfo psi32; + + if (sizeof(psi32) != len) + return EINVAL; + + psi32.psi_lwpid = psi->psi_lwpid; + netbsd32_si_to_si32(&psi32.psi_siginfo, &psi->psi_siginfo); + return copyout(&psi32, addr, sizeof(psi32)); +} static int netbsd32_doregs(struct lwp *curl /*tracer*/, @@ -205,8 +232,10 @@ netbsd32_dodbregs(struct lwp *curl /*tra } static struct ptrace_methods netbsd32_ptm = { - .ptm_copyinpiod = netbsd32_copyinpiod, - .ptm_copyoutpiod = netbsd32_copyoutpiod, + .ptm_copyin_piod = netbsd32_copyin_piod, + .ptm_copyout_piod = netbsd32_copyout_piod, + .ptm_copyin_siginfo = netbsd32_copyin_siginfo, + .ptm_copyout_siginfo = netbsd32_copyout_siginfo, .ptm_doregs = netbsd32_doregs, .ptm_dofpregs = netbsd32_dofpregs, .ptm_dodbregs = netbsd32_dodbregs Index: src/sys/compat/netbsd32/netbsd32_signal.c diff -u src/sys/compat/netbsd32/netbsd32_signal.c:1.44 src/sys/compat/netbsd32/netbsd32_signal.c:1.45 --- src/sys/compat/netbsd32/netbsd32_signal.c:1.44 Wed Dec 6 14:15:27 2017 +++ src/sys/compat/netbsd32/netbsd32_signal.c Sun Dec 17 15:59:27 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32_signal.c,v 1.44 2017/12/06 19:15:27 christos Exp $ */ +/* $NetBSD: netbsd32_signal.c,v 1.45 2017/12/17 20:59:27 christos Exp $ */ /* * Copyright (c) 1998, 2001 Matthew R. Green @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: netbsd32_signal.c,v 1.44 2017/12/06 19:15:27 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: netbsd32_signal.c,v 1.45 2017/12/17 20:59:27 christos Exp $"); #if defined(_KERNEL_OPT) #include "opt_ktrace.h" @@ -315,6 +315,49 @@ netbsd32_si_to_si32(siginfo32_t *si32, c } void +netbsd32_si32_to_si(siginfo_t *si, const siginfo32_t *si32) +{ + memset(si, 0, sizeof (*si)); + si->si_signo = si32->si_signo; + si->si_code = si32->si_code; + si->si_errno = si32->si_errno; + + switch (si->si_signo) { + case 0: /* SA */ + si->si_value.sival_int = si32->si_value.sival_int; + break; + case SIGILL: + case SIGBUS: + case SIGSEGV: + case SIGFPE: + case SIGTRAP: + si->si_addr = (void *)(uintptr_t)si32->si_addr; + si->si_trap = si32->si_trap; + break; + case SIGALRM: + case SIGVTALRM: + case SIGPROF: + default: + si->si_pid = si32->si_pid; + si->si_uid = si32->si_uid; + si->si_value.sival_int = si32->si_value.sival_int; + break; + case SIGCHLD: + si->si_pid = si32->si_pid; + si->si_uid = si32->si_uid; + si->si_status = si32->si_status; + si->si_utime = si32->si_utime; + si->si_stime = si32->si_stime; + break; + case SIGURG: + case SIGIO: + si->si_band = si32->si_band; + si->si_fd = si32->si_fd; + break; + } +} + +void getucontext32(struct lwp *l, ucontext32_t *ucp) { struct proc *p = l->l_proc; Index: src/sys/kern/sys_ptrace.c diff -u src/sys/kern/sys_ptrace.c:1.4 src/sys/kern/sys_ptrace.c:1.5 --- src/sys/kern/sys_ptrace.c:1.4 Wed Feb 22 22:34:22 2017 +++ src/sys/kern/sys_ptrace.c Sun Dec 17 15:59:27 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_ptrace.c,v 1.4 2017/02/23 03:34:22 kamil Exp $ */ +/* $NetBSD: sys_ptrace.c,v 1.5 2017/12/17 20:59:27 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_ptrace.c,v 1.4 2017/02/23 03:34:22 kamil Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_ptrace.c,v 1.5 2017/12/17 20:59:27 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_ptrace.h" @@ -149,24 +149,47 @@ __KERNEL_RCSID(0, "$NetBSD: sys_ptrace.c * PTRACE methods */ -static int ptrace_copyinpiod(struct ptrace_io_desc *, const void *); -static void ptrace_copyoutpiod(const struct ptrace_io_desc *, void *); - static int -ptrace_copyinpiod(struct ptrace_io_desc *piod, const void *addr) +ptrace_copyin_piod(struct ptrace_io_desc *piod, const void *addr, size_t len) { + if (len != 0 && sizeof(*piod) != len) + return EINVAL; + return copyin(addr, piod, sizeof(*piod)); } -static void -ptrace_copyoutpiod(const struct ptrace_io_desc *piod, void *addr) +static int +ptrace_copyout_piod(const struct ptrace_io_desc *piod, void *addr, size_t len) +{ + if (len != 0 && sizeof(*piod) != len) + return EINVAL; + + return copyout(piod, addr, sizeof(*piod)); +} + +static int +ptrace_copyin_siginfo(struct ptrace_siginfo *psi, const void *addr, size_t len) { - (void) copyout(piod, addr, sizeof(*piod)); + if (sizeof(*psi) != len) + return EINVAL; + + return copyin(addr, psi, sizeof(*psi)); +} + +static int +ptrace_copyout_siginfo(const struct ptrace_siginfo *psi, void *addr, size_t len) +{ + if (sizeof(*psi) != len) + return EINVAL; + + return copyout(psi, addr, sizeof(*psi)); } static struct ptrace_methods native_ptm = { - .ptm_copyinpiod = ptrace_copyinpiod, - .ptm_copyoutpiod = ptrace_copyoutpiod, + .ptm_copyin_piod = ptrace_copyin_piod, + .ptm_copyout_piod = ptrace_copyout_piod, + .ptm_copyin_siginfo = ptrace_copyin_siginfo, + .ptm_copyout_siginfo = ptrace_copyout_siginfo, .ptm_doregs = process_doregs, .ptm_dofpregs = process_dofpregs, .ptm_dodbregs = process_dodbregs, Index: src/sys/kern/sys_ptrace_common.c diff -u src/sys/kern/sys_ptrace_common.c:1.28 src/sys/kern/sys_ptrace_common.c:1.29 --- src/sys/kern/sys_ptrace_common.c:1.28 Sun Dec 17 10:43:27 2017 +++ src/sys/kern/sys_ptrace_common.c Sun Dec 17 15:59:27 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_ptrace_common.c,v 1.28 2017/12/17 15:43:27 christos Exp $ */ +/* $NetBSD: sys_ptrace_common.c,v 1.29 2017/12/17 20:59:27 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.28 2017/12/17 15:43:27 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.29 2017/12/17 20:59:27 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_ptrace.h" @@ -531,31 +531,24 @@ ptrace_update_lwp(struct proc *t, struct } static int -ptrace_get_siginfo(struct proc *t, void *addr, size_t data) +ptrace_get_siginfo(struct proc *t, struct ptrace_methods *ptm, void *addr, + size_t data) { struct ptrace_siginfo psi; - if (data != sizeof(psi)) { - DPRINTF(("%s: %zu != %zu\n", __func__, data, sizeof(psi))); - return EINVAL; - } psi.psi_siginfo._info = t->p_sigctx.ps_info; psi.psi_lwpid = t->p_sigctx.ps_lwp; - return copyout(&psi, addr, sizeof(psi)); + return ptm->ptm_copyout_siginfo(&psi, addr, data); } static int -ptrace_set_siginfo(struct proc *t, struct lwp **lt, void *addr, size_t data) +ptrace_set_siginfo(struct proc *t, struct lwp **lt, struct ptrace_methods *ptm, + void *addr, size_t data) { struct ptrace_siginfo psi; - if (data != sizeof(psi)) { - DPRINTF(("%s: %zu != %zu\n", __func__, data, sizeof(psi))); - return EINVAL; - } - - int error = copyin(addr, &psi, sizeof(psi)); + int error = ptm->ptm_copyin_siginfo(&psi, addr, data); if (error) return error; @@ -1056,11 +1049,11 @@ do_ptrace(struct ptrace_methods *ptm, st break; case PT_IO: - if ((error = ptm->ptm_copyinpiod(&piod, addr)) != 0) + if ((error = ptm->ptm_copyin_piod(&piod, addr, data)) != 0) break; if ((error = ptrace_doio(l, t, lt, &piod, addr, &vm)) != 0) break; - (void) ptm->ptm_copyoutpiod(&piod, addr); + (void) ptm->ptm_copyout_piod(&piod, addr, data); uvmspace_free(vm); break; @@ -1289,11 +1282,11 @@ do_ptrace(struct ptrace_methods *ptm, st break; case PT_SET_SIGINFO: - error = ptrace_set_siginfo(t, <, addr, data); + error = ptrace_set_siginfo(t, <, ptm, addr, data); break; case PT_GET_SIGINFO: - error = ptrace_get_siginfo(t, addr, data); + error = ptrace_get_siginfo(t, ptm, addr, data); break; case PT_SET_SIGMASK: Index: src/sys/sys/ptrace.h diff -u src/sys/sys/ptrace.h:1.61 src/sys/sys/ptrace.h:1.62 --- src/sys/sys/ptrace.h:1.61 Sun Dec 10 05:56:50 2017 +++ src/sys/sys/ptrace.h Sun Dec 17 15:59:28 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: ptrace.h,v 1.61 2017/12/10 10:56:50 martin Exp $ */ +/* $NetBSD: ptrace.h,v 1.62 2017/12/17 20:59:28 christos Exp $ */ /*- * Copyright (c) 1984, 1993 @@ -186,8 +186,10 @@ struct dbreg; #endif struct ptrace_methods { - int (*ptm_copyinpiod)(struct ptrace_io_desc *, const void *); - void (*ptm_copyoutpiod)(const struct ptrace_io_desc *, void *); + int (*ptm_copyin_piod)(struct ptrace_io_desc *, const void *, size_t); + int (*ptm_copyout_piod)(const struct ptrace_io_desc *, void *, size_t); + int (*ptm_copyin_siginfo)(struct ptrace_siginfo *, const void *, size_t); + int (*ptm_copyout_siginfo)(const struct ptrace_siginfo *, void *, size_t); int (*ptm_doregs)(struct lwp *, struct lwp *, struct uio *); int (*ptm_dofpregs)(struct lwp *, struct lwp *, struct uio *); int (*ptm_dodbregs)(struct lwp *, struct lwp *, struct uio *);