Loading...
iokit/bsddev/IOKitBSDInit.cpp xnu-12377.101.15 xnu-11215.41.3
--- xnu/xnu-12377.101.15/iokit/bsddev/IOKitBSDInit.cpp
+++ xnu/xnu-11215.41.3/iokit/bsddev/IOKitBSDInit.cpp
@@ -664,12 +664,7 @@
 
 	if (reboot) {
 		IOLog("\nAbout to reboot into Recovery!\n");
-		// Mitigation for SEP hanging on kPERestartCPU (radar://164664790).
-		// We panic and on the next boot we should land into recovery.
-		// This should be reverted back to calling
-		// PEHaltRestart(kPERestartCPU) in rdar://169561102.
-		panic("Reboot into Recovery (this panic is expected)");
-		// (void)PEHaltRestart(kPERestartCPU);
+		(void)PEHaltRestart(kPEPanicRestartCPUNoCallouts);
 	}
 
 	return true;
@@ -1348,7 +1343,7 @@
 
 	do {
 		// This file reference remains open long-term in case we need to write a core-dump
-		err = IOPolledFileOpen(filename, kIOPolledFileCreate, 0 /*setFileSizeMin*/, corefile_size_bytes, free_space_to_leave_bytes,
+		err = IOPolledFileOpen(filename, kIOPolledFileCreate, corefile_size_bytes, free_space_to_leave_bytes,
 		    NULL, 0, &gIOPolledCoreFileVars, NULL, NULL, NULL);
 		if (kIOReturnSuccess == err) {
 			break;
@@ -1366,7 +1361,7 @@
 			return;
 		}
 
-		err = IOPolledFileOpen(filename, kIOPolledFileCreate, 0 /*setFileSizeMin*/, corefile_fallback_size_bytes, free_space_to_leave_bytes,
+		err = IOPolledFileOpen(filename, kIOPolledFileCreate, corefile_fallback_size_bytes, free_space_to_leave_bytes,
 		    NULL, 0, &gIOPolledCoreFileVars, NULL, NULL, NULL);
 		if (kIOReturnSuccess != err) {
 			IOLog("Failed to open corefile of size %llu MB (returned error 0x%x)\n",
@@ -1574,10 +1569,6 @@
 	}
 	proc_t proc = (proc_t)get_bsdtask_info(task);
 
-	if (proc == NULL) {
-		return false;
-	}
-
 	kern_return_t ret = amfi->OSEntitlements.queryEntitlementStringWithProc(
 		proc,
 		entitlement,
@@ -1596,14 +1587,6 @@
 	return IOTaskHasEntitlement(NULL, entitlement);
 }
 
-/*
- * Reminder to reader: This only returns `true` if:
- *  - The entitlement is boolean-valued
- *  - The value is `true`
- * If you are looking to check whether an entitlement is present,
- * you likely want `IOVnodeIsEntitlementPresentWithAnyValue`
- * or `IOTaskHasEntitlementAsBooleanOrObject` (caveat emptor).
- */
 extern "C" boolean_t
 IOTaskHasEntitlement(task_t task, const char *entitlement)
 {
@@ -1617,10 +1600,6 @@
 	}
 	proc_t proc = (proc_t)get_bsdtask_info(task);
 
-	if (proc == NULL) {
-		return false;
-	}
-
 	kern_return_t ret = amfi->OSEntitlements.queryEntitlementBooleanWithProc(
 		proc,
 		entitlement);
@@ -1632,24 +1611,27 @@
 	return false;
 }
 
-extern "C" boolean_t
-IOTaskGetIntegerEntitlement(task_t task, const char *entitlement, uint64_t *value)
+extern "C" OS_ALWAYS_INLINE char*
+IOCurrentTaskGetEntitlement(const char *entitlement)
+{
+	return IOTaskGetEntitlement(NULL, entitlement);
+}
+
+extern "C" char*
+IOTaskGetEntitlement(task_t task, const char *entitlement)
 {
 	void *entitlement_object = NULL;
+	char *return_value = NULL;
 
 	if (task == NULL) {
 		task = current_task();
 	}
 
 	/* Validate input arguments */
-	if (task == kernel_task || entitlement == NULL || value == NULL) {
-		return false;
+	if (task == kernel_task || entitlement == NULL) {
+		return NULL;
 	}
 	proc_t proc = (proc_t)get_bsdtask_info(task);
-
-	if (proc == NULL) {
-		return false;
-	}
 
 	kern_return_t ret = amfi->OSEntitlements.copyEntitlementAsOSObjectWithProc(
 		proc,
@@ -1657,115 +1639,20 @@
 		&entitlement_object);
 
 	if (ret != KERN_SUCCESS) {
-		return false;
+		return NULL;
 	}
 	assert(entitlement_object != NULL);
 
 	OSObject *os_object = (OSObject*)entitlement_object;
-	OSNumber *os_number = OSDynamicCast(OSNumber, os_object);
-
-	boolean_t has_entitlement = os_number != NULL;
-	if (has_entitlement) {
-		*value = os_number->unsigned64BitValue();
-	}
+	OSString *os_string = OSDynamicCast(OSString, os_object);
+
+	/* Get a C string version of the OSString */
+	return_value = copyOSStringAsCString(os_string);
 
 	/* Free the OSObject which was given to us */
 	OSSafeReleaseNULL(os_object);
 
-	return has_entitlement;
-}
-
-extern "C" OS_ALWAYS_INLINE char*
-IOCurrentTaskGetEntitlement(const char *entitlement)
-{
-	return IOTaskGetEntitlement(NULL, entitlement);
-}
-
-extern "C" char*
-IOTaskGetEntitlement(task_t task, const char *entitlement)
-{
-	void *entitlement_object = NULL;
-	char *return_value = NULL;
-
-	if (task == NULL) {
-		task = current_task();
-	}
-
-	/* Validate input arguments */
-	if (task == kernel_task || entitlement == NULL) {
-		return NULL;
-	}
-	proc_t proc = (proc_t)get_bsdtask_info(task);
-
-	if (proc == NULL) {
-		return NULL;
-	}
-
-	kern_return_t ret = amfi->OSEntitlements.copyEntitlementAsOSObjectWithProc(
-		proc,
-		entitlement,
-		&entitlement_object);
-
-	if (ret != KERN_SUCCESS) {
-		return NULL;
-	}
-	assert(entitlement_object != NULL);
-
-	OSObject *os_object = (OSObject*)entitlement_object;
-	OSString *os_string = OSDynamicCast(OSString, os_object);
-
-	/* Get a C string version of the OSString */
-	return_value = copyOSStringAsCString(os_string);
-
-	/* Free the OSObject which was given to us */
-	OSSafeReleaseNULL(os_object);
-
 	return return_value;
-}
-
-extern "C" boolean_t
-IOTaskHasEntitlementAsBooleanOrObject(task_t task, const char *entitlement)
-{
-	if (task == NULL) {
-		task = current_task();
-	}
-
-	/* Validate input arguments */
-	if (task == kernel_task || entitlement == NULL) {
-		return false;
-	}
-	proc_t proc = (proc_t)get_bsdtask_info(task);
-
-	if (proc == NULL) {
-		return false;
-	}
-
-	kern_return_t ret = amfi->OSEntitlements.queryEntitlementBooleanWithProc(
-		proc,
-		entitlement);
-	if (ret == KERN_SUCCESS) {
-		return true;
-	}
-
-	/* Check for the presence of an object */
-	void *entitlement_object = NULL;
-	ret = amfi->OSEntitlements.copyEntitlementAsOSObjectWithProc(
-		proc,
-		entitlement,
-		&entitlement_object);
-	if (ret != KERN_SUCCESS) {
-		return false;
-	}
-	assert(entitlement_object != NULL);
-
-	OSObject *os_object = (OSObject*)entitlement_object;
-
-	bool not_false_entitlement = (os_object != kOSBooleanFalse);
-
-	/* Free the OSObject which was given to us */
-	OSSafeReleaseNULL(os_object);
-
-	return not_false_entitlement;
 }
 
 extern "C" boolean_t
@@ -1780,83 +1667,6 @@
 	}
 	obj->release();
 	return obj != kOSBooleanFalse;
-}
-
-extern "C" boolean_t
-IOVnodeIsEntitlementPresentWithAnyValue(vnode_t vnode, int64_t off, const char *entitlement)
-{
-	OSObject * obj;
-	off_t offset = (off_t)off;
-
-	obj = IOUserClient::copyClientEntitlementVnode(vnode, offset, entitlement);
-	if (!obj) {
-		return false;
-	}
-	obj->release();
-	return true;
-}
-
-/*
- * Support querying an OSBoolean entitlement value,
- * while distinguishing between the following cases:
- *     - the entitlement does not exist.
- *     - the entitlement exists with a value of false.
- *     - the entitlement exists with a value of true.
- *
- * Return value:
- *     - false if the entitlement does not exist.
- *     - true if the entitlement exists.
- *
- * If the return value is true, the `value` argument will
- * hold the entitlement value, which has to be Boolean.
- */
-extern "C" boolean_t
-IOVnodeGetBooleanEntitlement(
-	vnode_t vnode,
-	int64_t off,
-	const char *entitlement,
-	bool *value)
-{
-	OSObject * obj;
-	off_t offset = (off_t)off;
-
-	obj = IOUserClient::copyClientEntitlementVnode(vnode, offset, entitlement);
-	if (!obj) {
-		return false;
-	}
-
-	if (obj == kOSBooleanTrue) {
-		*value = true;
-	} else if (obj == kOSBooleanFalse) {
-		*value = false;
-	} else {
-		panic("%s: entitlement is not OSBoolean", __func__);
-	}
-
-	obj->release();
-	return true;
-}
-
-extern boolean_t
-IOVnodeGetIntegerEntitlement(struct vnode *vnode, int64_t off, const char *entitlement, uint64_t *value)
-{
-	OSObject *obj;
-	boolean_t ret = false;
-	off_t offset = (off_t)off;
-
-	obj = IOUserClient::copyClientEntitlementVnode(vnode, offset, entitlement);
-	if (!obj) {
-		return ret;
-	}
-
-	OSNumber *num = OSDynamicCast(OSNumber, obj);
-	if (num) {
-		*value = num->unsigned64BitValue();
-		ret = true;
-	}
-
-	obj->release();
-	return ret;
 }
 
 extern "C" char *