]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/kern/mach_process.c
xnu-517.9.5.tar.gz
[apple/xnu.git] / bsd / kern / mach_process.c
index e7df848def52a9b910a8026196e917dbcd46bea8..8c0567ea1c5e18f4928cc8d2cb5d0d7da5780908 100644 (file)
@@ -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@
  * 
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
@@ -75,6 +75,8 @@
 
 #include <sys/mount.h>
 
 
 #include <sys/mount.h>
 
+#include <bsm/audit_kernel.h>
+
 #include <kern/task.h>
 #include <kern/thread.h>
 #include <mach/machine/thread_status.h>
 #include <kern/task.h>
 #include <kern/thread.h>
 #include <mach/machine/thread_status.h>
@@ -85,7 +87,6 @@
 #define        ISSET(t, f)     ((t) & (f))
 
 void psignal_lock __P((struct proc *, int, int));
 #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.
 
 /*
  * sys-trace system call.
@@ -114,7 +115,7 @@ ptrace(p, uap, retval)
        int             *locr0;
        int error = 0;
 #if defined(ppc)
        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
 #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;
 
        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)) {
 
         if (uap->req == PT_DENY_ATTACH) {
                if (ISSET(p->p_flag, P_TRACED)) {
@@ -169,6 +174,8 @@ ptrace(p, uap, retval)
                        return (ESRCH);
 
 
                        return (ESRCH);
 
 
+       AUDIT_ARG(process, t);
+
        /* We do not want ptrace to do anything with kernel, init 
         * and mach_init
         */
        /* 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)
                        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
                        goto errorLabel;
                }       
 #else
@@ -303,9 +310,9 @@ ptrace(p, uap, retval)
                if (!ALIGNED((int)uap->addr, sizeof(int)))
                        return (ERESTART);
 
                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
                        goto errorLabel;
                }       
 #undef         ALIGNED
@@ -321,8 +328,8 @@ ptrace(p, uap, retval)
                        psignal_lock(t, uap->data, 0);
                 }
 #if defined(ppc)
                        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
                        goto errorLabel;
                }       
 #endif
@@ -346,8 +353,8 @@ ptrace(p, uap, retval)
 #endif
                }
 #if defined (ppc)
 #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
                        goto errorLabel;
                }       
 #endif
@@ -356,7 +363,8 @@ ptrace(p, uap, retval)
                t->p_stat = SRUN;
                if (t->sigwait) {
                        wakeup((caddr_t)&(t->sigwait));
                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;
                
                }
                break;