Loading...
iokit/Kernel/RootDomainUserClient.cpp xnu-10063.141.1 xnu-4903.270.47
--- xnu/xnu-10063.141.1/iokit/Kernel/RootDomainUserClient.cpp
+++ xnu/xnu-4903.270.47/iokit/Kernel/RootDomainUserClient.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998-2020 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 1998-2012 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  *
@@ -39,11 +39,11 @@
 #include <IOKit/pwr_mgt/IOPMPrivate.h>
 #include <sys/proc.h>
 
-#define super IOUserClient2022
+#define super IOUserClient
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-OSDefineMetaClassAndStructors(RootDomainUserClient, IOUserClient2022)
+OSDefineMetaClassAndStructors(RootDomainUserClient, IOUserClient)
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
@@ -74,11 +74,6 @@
 	}
 	fOwner = (IOPMrootDomain *)provider;
 
-	setProperty(kIOUserClientDefaultLockingKey, kOSBooleanTrue);
-	setProperty(kIOUserClientDefaultLockingSetPropertiesKey, kOSBooleanTrue);
-	setProperty(kIOUserClientDefaultLockingSingleThreadExternalMethodKey, kOSBooleanFalse);
-
-	setProperty(kIOUserClientEntitlementsKey, kOSBooleanFalse);
 
 	return true;
 }
@@ -98,6 +93,8 @@
 	int             local_priv = 0;
 	int             admin_priv = 0;
 	IOReturn        ret = kIOReturnNotPrivileged;
+	OSDictionary    *unserializedOptions =  NULL;
+	OSString        *unserializeErrorString = NULL;
 
 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeLocalUser);
 	local_priv = (kIOReturnSuccess == ret);
@@ -105,38 +102,38 @@
 	ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
 	admin_priv = (kIOReturnSuccess == ret);
 
+
+	if (inOptions) {
+		unserializedOptions = OSDynamicCast( OSDictionary,
+		    OSUnserializeXML((const char *)inOptions, inOptionsSize, &unserializeErrorString));
+
+		if (!unserializedOptions) {
+			IOLog("IOPMRootDomain SleepSystem unserialization failure: %s\n",
+			    unserializeErrorString ? unserializeErrorString->getCStringNoCopy() : "Unknown");
+		}
+	}
+
 	if ((local_priv || admin_priv) && fOwner) {
-		OSString        *unserializeErrorString = NULL;
-		OSObject        *unserializedObject = NULL;
-		OSDictionary    *sleepOptionsDict = NULL; // do not release
-
 		proc_t p;
 		p = (proc_t)get_bsdtask_info(fOwningTask);
 		if (p) {
 			fOwner->setProperty("SleepRequestedByPID", proc_pid(p), 32);
 		}
 
-		if (inOptions) {
-			unserializedObject = OSUnserializeXML((const char *)inOptions, inOptionsSize, &unserializeErrorString);
-			sleepOptionsDict = OSDynamicCast( OSDictionary, unserializedObject);
-			if (!sleepOptionsDict) {
-				IOLog("IOPMRootDomain SleepSystem unserialization failure: %s\n",
-				    unserializeErrorString ? unserializeErrorString->getCStringNoCopy() : "Unknown");
-			}
-		}
-
-		if (sleepOptionsDict) {
+		if (unserializedOptions) {
 			// Publish Sleep Options in registry under root_domain
-			fOwner->setProperty( kRootDomainSleepOptionsKey, sleepOptionsDict);
+			fOwner->setProperty( kRootDomainSleepOptionsKey, unserializedOptions);
+
+			*returnCode = fOwner->sleepSystemOptions( unserializedOptions );
+
+			unserializedOptions->release();
 		} else {
 			// No options
 			// Clear any pre-existing options
 			fOwner->removeProperty( kRootDomainSleepOptionsKey );
-		}
-
-		*returnCode = fOwner->sleepSystemOptions( sleepOptionsDict );
-		OSSafeReleaseNULL(unserializedObject);
-		OSSafeReleaseNULL(unserializeErrorString);
+
+			*returnCode = fOwner->sleepSystemOptions( NULL );
+		}
 	} else {
 		*returnCode = kIOReturnNotPrivileged;
 	}
@@ -236,267 +233,138 @@
 {
 	if (fOwningTask) {
 		task_deallocate(fOwningTask);
-		fOwningTask = NULL;
+		fOwningTask = 0;
 	}
 
 	super::stop(provider);
 }
 
 IOReturn
-RootDomainUserClient::externalMethod(uint32_t selector, IOExternalMethodArgumentsOpaque * args )
-{
-	static const IOExternalMethodDispatch2022 dispatchArray[] = {
-		[kPMSetAggressiveness] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 2,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 1,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMGetAggressiveness] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 1,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 1,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMSleepSystem] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 0,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 1,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMAllowPowerChange] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 1,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMCancelPowerChange] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 1,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMShutdownSystem] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 0,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMRestartSystem] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 0,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMSleepSystemOptions] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 0,
-			.checkStructureInputSize  = kIOUCVariableStructureSize,
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = sizeof(uint32_t),
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMSetMaintenanceWakeCalendar] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 0,
-			.checkStructureInputSize  = sizeof(IOPMCalendarStruct),
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = sizeof(uint32_t),
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMSetUserAssertionLevels] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 1,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMActivityTickle] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 0,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMSetClamshellSleepState] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 1,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMGetSystemSleepType] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 0,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 2,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMSleepWakeWatchdogEnable] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 0,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMSleepWakeDebugTrig] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 0,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-		[kPMSetDisplayPowerOn] = {
-			.function                 = &RootDomainUserClient::externalMethodDispatched,
-			.checkScalarInputCount    = 1,
-			.checkStructureInputSize  = 0,
-			.checkScalarOutputCount   = 0,
-			.checkStructureOutputSize = 0,
-			.allowAsync               = false,
-			.checkEntitlement         = NULL,
-		},
-	};
-
-	return dispatchExternalMethod(selector, args, dispatchArray, sizeof(dispatchArray) / sizeof(dispatchArray[0]), this, NULL);
-}
-IOReturn
-RootDomainUserClient::externalMethodDispatched(OSObject * target, void * reference, IOExternalMethodArguments * arguments)
+RootDomainUserClient::externalMethod(
+	uint32_t selector,
+	IOExternalMethodArguments * arguments,
+	IOExternalMethodDispatch * dispatch __unused,
+	OSObject * target __unused,
+	void * reference __unused )
 {
 	IOReturn    ret = kIOReturnBadArgument;
-	RootDomainUserClient * me = (typeof(me))target;
-	switch (arguments->selector) {
+
+	switch (selector) {
 	case kPMSetAggressiveness:
-		ret = me->secureSetAggressiveness(
-			(unsigned long)arguments->scalarInput[0],
-			(unsigned long)arguments->scalarInput[1],
-			(int *)&arguments->scalarOutput[0]);
+		if ((2 == arguments->scalarInputCount)
+		    && (1 == arguments->scalarOutputCount)) {
+			ret = this->secureSetAggressiveness(
+				(unsigned long)arguments->scalarInput[0],
+				(unsigned long)arguments->scalarInput[1],
+				(int *)&arguments->scalarOutput[0]);
+		}
 		break;
 
 	case kPMGetAggressiveness:
-		ret = me->fOwner->getAggressiveness(
-			(unsigned long)arguments->scalarInput[0],
-			(unsigned long *)&arguments->scalarOutput[0]);
+		if ((1 == arguments->scalarInputCount)
+		    && (1 == arguments->scalarOutputCount)) {
+			ret = fOwner->getAggressiveness(
+				(unsigned long)arguments->scalarInput[0],
+				(unsigned long *)&arguments->scalarOutput[0]);
+		}
 		break;
 
 	case kPMSleepSystem:
-		ret = me->secureSleepSystem(
-			(uint32_t *)&arguments->scalarOutput[0]);
+		if (1 == arguments->scalarOutputCount) {
+			ret = this->secureSleepSystem(
+				(uint32_t *)&arguments->scalarOutput[0]);
+		}
 		break;
 
 	case kPMAllowPowerChange:
-		ret = me->fOwner->allowPowerChange(
-			arguments->scalarInput[0]);
+		if (1 == arguments->scalarInputCount) {
+			ret = fOwner->allowPowerChange(
+				arguments->scalarInput[0]);
+		}
 		break;
 
 	case kPMCancelPowerChange:
-		ret = me->fOwner->cancelPowerChange(
-			arguments->scalarInput[0]);
+		if (1 == arguments->scalarInputCount) {
+			ret = fOwner->cancelPowerChange(
+				arguments->scalarInput[0]);
+		}
 		break;
 
 	case kPMShutdownSystem:
-		// deprecated interface
+		// deperecated interface
 		ret = kIOReturnUnsupported;
 		break;
 
 	case kPMRestartSystem:
-		// deprecated interface
+		// deperecated interface
 		ret = kIOReturnUnsupported;
 		break;
 
 	case kPMSleepSystemOptions:
-		ret = me->secureSleepSystemOptions(
+		ret = this->secureSleepSystemOptions(
 			arguments->structureInput,
 			arguments->structureInputSize,
-			(uint32_t *)&arguments->structureOutput);
+			(uint32_t *)&arguments->scalarOutput[0]);
 		break;
 	case kPMSetMaintenanceWakeCalendar:
-		ret = me->secureSetMaintenanceWakeCalendar(
-			(IOPMCalendarStruct *)arguments->structureInput,
-			(uint32_t *)&arguments->structureOutput);
-		arguments->structureOutputSize = sizeof(uint32_t);
+		if ((arguments->structureInputSize >= sizeof(IOPMCalendarStruct)) &&
+		    (arguments->structureOutputSize >= sizeof(uint32_t))) {
+			ret = this->secureSetMaintenanceWakeCalendar(
+				(IOPMCalendarStruct *)arguments->structureInput,
+				(uint32_t *)&arguments->structureOutput);
+			arguments->structureOutputSize = sizeof(uint32_t);
+		}
 		break;
 
 	case kPMSetUserAssertionLevels:
-		ret = me->secureSetUserAssertionLevels(
+		ret = this->secureSetUserAssertionLevels(
 			(uint32_t)arguments->scalarInput[0]);
 		break;
 
 	case kPMActivityTickle:
-		if (me->fOwner->checkSystemCanSustainFullWake()) {
-			me->fOwner->reportUserInput();
-			me->fOwner->setProperty(kIOPMRootDomainWakeTypeKey, "UserActivity Assertion");
+		if (fOwner->checkSystemCanSustainFullWake()) {
+			fOwner->reportUserInput();
+			fOwner->setProperty(kIOPMRootDomainWakeTypeKey, "UserActivity Assertion");
 		}
 		ret = kIOReturnSuccess;
 		break;
 
 	case kPMSetClamshellSleepState:
-		me->fOwner->setClamShellSleepDisable(arguments->scalarInput[0] ? true : false,
-		    IOPMrootDomain::kClamshellSleepDisablePowerd);
+		fOwner->setDisableClamShellSleep(arguments->scalarInput[0] ? true : false);
 		ret = kIOReturnSuccess;
 		break;
 
 	case kPMGetSystemSleepType:
-		ret = me->secureGetSystemSleepType(
-			(uint32_t *) &arguments->scalarOutput[0],
-			(uint32_t *) &arguments->scalarOutput[1]);
+		if (2 == arguments->scalarOutputCount) {
+			ret = this->secureGetSystemSleepType(
+				(uint32_t *) &arguments->scalarOutput[0],
+				(uint32_t *) &arguments->scalarOutput[1]);
+		}
 		break;
 
 #if defined(__i386__) || defined(__x86_64__)
 	case kPMSleepWakeWatchdogEnable:
-		ret = clientHasPrivilege(me->fOwningTask, kIOClientPrivilegeAdministrator);
+		ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
 		if (ret == kIOReturnSuccess) {
-			me->fOwner->sleepWakeDebugEnableWdog();
+			fOwner->sleepWakeDebugEnableWdog();
 		}
 		break;
 
 
 	case kPMSleepWakeDebugTrig:
-		ret = clientHasPrivilege(me->fOwningTask, kIOClientPrivilegeAdministrator);
+		ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
 		if (ret == kIOReturnSuccess) {
-			me->fOwner->sleepWakeDebugTrig(false);
+			fOwner->sleepWakeDebugTrig(false);
 		}
 		break;
 #endif
 
 	case kPMSetDisplayPowerOn:
-		ret = clientHasPrivilege(me->fOwningTask, kIOClientPrivilegeAdministrator);
-		if (ret == kIOReturnSuccess) {
-			me->fOwner->setDisplayPowerOn((uint32_t)arguments->scalarInput[0]);
+		if (1 == arguments->scalarInputCount) {
+			ret = clientHasPrivilege(fOwningTask, kIOClientPrivilegeAdministrator);
+			if (ret == kIOReturnSuccess) {
+				fOwner->setDisplayPowerOn((uint32_t)arguments->scalarInput[0]);
+			}
 		}
 		break;