]> 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 583080bafd0a45809fb220109a3bf32e84ae97e5..8c0567ea1c5e18f4928cc8d2cb5d0d7da5780908 100644 (file)
@@ -1,24 +1,21 @@
 /*
 /*
- * 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@
  * 
- * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License").  You may not use this file except in compliance with the
+ * License.  Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
  * 
  * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
  * 
  * @APPLE_LICENSE_HEADER_END@
  */
  * 
  * @APPLE_LICENSE_HEADER_END@
  */
@@ -78,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>
@@ -88,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.
@@ -117,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
@@ -126,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)) {
@@ -172,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
         */
@@ -291,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
@@ -306,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
@@ -324,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
@@ -349,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
@@ -359,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;