Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/freebsd32/freebsd32_misc.c
Show First 20 Lines • Show All 926 Lines • ▼ Show 20 Lines | |||||
int | int | ||||
freebsd32_ptrace(struct thread *td, struct freebsd32_ptrace_args *uap) | freebsd32_ptrace(struct thread *td, struct freebsd32_ptrace_args *uap) | ||||
{ | { | ||||
union { | union { | ||||
struct ptrace_io_desc piod; | struct ptrace_io_desc piod; | ||||
struct ptrace_lwpinfo pl; | struct ptrace_lwpinfo pl; | ||||
struct ptrace_vm_entry pve; | struct ptrace_vm_entry pve; | ||||
struct ptrace_coredump pc; | |||||
struct dbreg32 dbreg; | struct dbreg32 dbreg; | ||||
struct fpreg32 fpreg; | struct fpreg32 fpreg; | ||||
struct reg32 reg; | struct reg32 reg; | ||||
register_t args[nitems(td->td_sa.args)]; | register_t args[nitems(td->td_sa.args)]; | ||||
struct ptrace_sc_ret psr; | struct ptrace_sc_ret psr; | ||||
int ptevents; | int ptevents; | ||||
} r; | } r; | ||||
union { | union { | ||||
struct ptrace_io_desc32 piod; | struct ptrace_io_desc32 piod; | ||||
struct ptrace_lwpinfo32 pl; | struct ptrace_lwpinfo32 pl; | ||||
struct ptrace_vm_entry32 pve; | struct ptrace_vm_entry32 pve; | ||||
struct ptrace_coredump32 pc; | |||||
uint32_t args[nitems(td->td_sa.args)]; | uint32_t args[nitems(td->td_sa.args)]; | ||||
struct ptrace_sc_ret32 psr; | struct ptrace_sc_ret32 psr; | ||||
} r32; | } r32; | ||||
void *addr; | void *addr; | ||||
int data, error = 0, i; | int data, error = 0, i; | ||||
AUDIT_ARG_PID(uap->pid); | AUDIT_ARG_PID(uap->pid); | ||||
AUDIT_ARG_CMD(uap->req); | AUDIT_ARG_CMD(uap->req); | ||||
▲ Show 20 Lines • Show All 61 Lines • ▼ Show 20 Lines | case PT_VM_ENTRY: | ||||
CP(r32.pve, r.pve, pve_start); | CP(r32.pve, r.pve, pve_start); | ||||
CP(r32.pve, r.pve, pve_end); | CP(r32.pve, r.pve, pve_end); | ||||
CP(r32.pve, r.pve, pve_offset); | CP(r32.pve, r.pve, pve_offset); | ||||
CP(r32.pve, r.pve, pve_prot); | CP(r32.pve, r.pve, pve_prot); | ||||
CP(r32.pve, r.pve, pve_pathlen); | CP(r32.pve, r.pve, pve_pathlen); | ||||
CP(r32.pve, r.pve, pve_fileid); | CP(r32.pve, r.pve, pve_fileid); | ||||
CP(r32.pve, r.pve, pve_fsid); | CP(r32.pve, r.pve, pve_fsid); | ||||
PTRIN_CP(r32.pve, r.pve, pve_path); | PTRIN_CP(r32.pve, r.pve, pve_path); | ||||
break; | |||||
case PT_COREDUMP: | |||||
if (uap->data != sizeof(r32.pc)) | |||||
error = EINVAL; | |||||
else | |||||
error = copyin(uap->addr, &r32.pc, uap->data); | |||||
CP(r32.pc, r.pc, pc_fd); | |||||
r.pc.pc_limit = PAIR32TO64(off_t, r32.pc.pc_limit); | |||||
CP(r32.pc, r.pc, pc_flags); | |||||
markj: Do you have to update `data` to make it equal to `sizeof(r.pc)`? | |||||
break; | break; | ||||
default: | default: | ||||
addr = uap->addr; | addr = uap->addr; | ||||
break; | break; | ||||
} | } | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
▲ Show 20 Lines • Show All 2,815 Lines • Show Last 20 Lines |
Do you have to update data to make it equal to sizeof(r.pc)?