X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/de355530ae67247cbd0da700edb3a2a1dae884c2..5eebf7385fedb1517b66b53c28e5aa6bb0a2be50:/bsd/kern/mach_process.c diff --git a/bsd/kern/mach_process.c b/bsd/kern/mach_process.c index e7df848de..8c0567ea1 100644 --- a/bsd/kern/mach_process.c +++ b/bsd/kern/mach_process.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -75,6 +75,8 @@ #include +#include + #include #include #include @@ -85,7 +87,6 @@ #define ISSET(t, f) ((t) & (f)) void psignal_lock __P((struct proc *, int, int)); -int isinferior __P((struct proc *, struct proc *)); /* * sys-trace system call. @@ -114,7 +115,7 @@ ptrace(p, uap, retval) int *locr0; int error = 0; #if defined(ppc) - struct ppc_thread_state statep; + struct ppc_thread_state64 statep; #elif defined(i386) struct i386_saved_state statep; #else @@ -123,6 +124,10 @@ ptrace(p, uap, retval) unsigned long state_count; int tr_sigexc = 0; + AUDIT_ARG(cmd, uap->req); + AUDIT_ARG(pid, uap->pid); + AUDIT_ARG(addr, uap->addr); + AUDIT_ARG(value, uap->data); if (uap->req == PT_DENY_ATTACH) { if (ISSET(p->p_flag, P_TRACED)) { @@ -169,6 +174,8 @@ ptrace(p, uap, retval) return (ESRCH); + AUDIT_ARG(process, t); + /* We do not want ptrace to do anything with kernel, init * and mach_init */ @@ -288,8 +295,8 @@ ptrace(p, uap, retval) goto errorLabel; } #elif defined(ppc) - state_count = PPC_THREAD_STATE_COUNT; - if (thread_getstatus(th_act, PPC_THREAD_STATE, &statep, &state_count) != KERN_SUCCESS) { + state_count = PPC_THREAD_STATE64_COUNT; + if (thread_getstatus(th_act, PPC_THREAD_STATE64, &statep, &state_count) != KERN_SUCCESS) { goto errorLabel; } #else @@ -303,9 +310,9 @@ ptrace(p, uap, retval) if (!ALIGNED((int)uap->addr, sizeof(int))) return (ERESTART); - statep.srr0 = (int)uap->addr; - state_count = PPC_THREAD_STATE_COUNT; - if (thread_setstatus(th_act, PPC_THREAD_STATE, &statep, &state_count) != KERN_SUCCESS) { + statep.srr0 = (uint64_t)((uint32_t)uap->addr); + state_count = PPC_THREAD_STATE64_COUNT; + if (thread_setstatus(th_act, PPC_THREAD_STATE64, &statep, &state_count) != KERN_SUCCESS) { goto errorLabel; } #undef ALIGNED @@ -321,8 +328,8 @@ ptrace(p, uap, retval) psignal_lock(t, uap->data, 0); } #if defined(ppc) - state_count = PPC_THREAD_STATE_COUNT; - if (thread_getstatus(th_act, PPC_THREAD_STATE, &statep, &state_count) != KERN_SUCCESS) { + state_count = PPC_THREAD_STATE64_COUNT; + if (thread_getstatus(th_act, PPC_THREAD_STATE64, &statep, &state_count) != KERN_SUCCESS) { goto errorLabel; } #endif @@ -346,8 +353,8 @@ ptrace(p, uap, retval) #endif } #if defined (ppc) - state_count = PPC_THREAD_STATE_COUNT; - if (thread_setstatus(th_act, PPC_THREAD_STATE, &statep, &state_count) != KERN_SUCCESS) { + state_count = PPC_THREAD_STATE64_COUNT; + if (thread_setstatus(th_act, PPC_THREAD_STATE64, &statep, &state_count) != KERN_SUCCESS) { goto errorLabel; } #endif @@ -356,7 +363,8 @@ ptrace(p, uap, retval) t->p_stat = SRUN; if (t->sigwait) { wakeup((caddr_t)&(t->sigwait)); - task_release(task); + if ((t->p_flag & P_SIGEXC) == 0) + task_release(task); } break;