]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/task.c
xnu-6153.141.1.tar.gz
[apple/xnu.git] / osfmk / kern / task.c
index df259cf29923ad330f93567a37fcf1a2aef24627..6c1d1aa80cf942fb33f6b41a1b85d14b6a6c7785 100644 (file)
 #include <security/mac_mach_internal.h>
 #endif
 
+#include <IOKit/IOBSD.h>
+
 #if KPERF
 extern int kpc_force_all_ctrs(task_t, int);
 #endif
 
-task_t                  kernel_task;
-zone_t                  task_zone;
+SECURITY_READ_ONLY_LATE(task_t) kernel_task;
+SECURITY_READ_ONLY_LATE(zone_t) task_zone;
 lck_attr_t      task_lck_attr;
 lck_grp_t       task_lck_grp;
 lck_grp_attr_t  task_lck_grp_attr;
@@ -750,6 +752,7 @@ task_reference_internal(task_t task)
        void *       bt[TASK_REF_BTDEPTH];
        int             numsaved = 0;
 
+       zone_require(task, task_zone);
        os_ref_retain(&task->ref_count);
 
        numsaved = OSBacktrace(bt, TASK_REF_BTDEPTH);
@@ -7492,3 +7495,35 @@ task_copy_vmobjects(task_t task, vm_object_query_t query, int len, int64_t* num)
 
        *num = i;
 }
+
+#if __has_feature(ptrauth_calls)
+
+#define PAC_EXCEPTION_ENTITLEMENT "com.apple.private.pac.exception"
+
+void
+task_set_pac_exception_fatal_flag(
+       task_t task)
+{
+       assert(task != TASK_NULL);
+
+       if (!IOTaskHasEntitlement(task, PAC_EXCEPTION_ENTITLEMENT)) {
+               return;
+       }
+
+       task_lock(task);
+       task->t_flags |= TF_PAC_EXC_FATAL;
+       task_unlock(task);
+}
+
+bool
+task_is_pac_exception_fatal(
+       task_t task)
+{
+       uint32_t flags = 0;
+
+       assert(task != TASK_NULL);
+
+       flags = os_atomic_load(&task->t_flags, relaxed);
+       return (bool)(flags & TF_PAC_EXC_FATAL);
+}
+#endif /* __has_feature(ptrauth_calls) */