Loading...
iokit/Kernel/RootDomainUserClient.cpp xnu-3248.50.21 xnu-4570.71.2
--- xnu/xnu-3248.50.21/iokit/Kernel/RootDomainUserClient.cpp
+++ xnu/xnu-4570.71.2/iokit/Kernel/RootDomainUserClient.cpp
@@ -198,7 +198,7 @@
 }
 
 IOReturn RootDomainUserClient::secureGetSystemSleepType(
-    uint32_t    *outSleepType)
+    uint32_t    *outSleepType, uint32_t *sleepTimer)
 {
     int                     admin_priv = 0;
     IOReturn                ret;
@@ -207,7 +207,7 @@
     admin_priv = (kIOReturnSuccess == ret);
 
     if (admin_priv && fOwner) {
-        ret = fOwner->getSystemSleepType(outSleepType);
+        ret = fOwner->getSystemSleepType(outSleepType, sleepTimer);
     } else {
         ret = kIOReturnNotPrivileged;
     }
@@ -216,14 +216,19 @@
 
 IOReturn RootDomainUserClient::clientClose( void )
 {
-    detach(fOwner);
-
+    terminate();
+
+    return kIOReturnSuccess;
+}
+
+void RootDomainUserClient::stop( IOService *provider)
+{
     if(fOwningTask) {
         task_deallocate(fOwningTask);
         fOwningTask = 0;
     }
 
-    return kIOReturnSuccess;
+    super::stop(provider);
 }
 
 IOReturn RootDomainUserClient::externalMethod(
@@ -299,10 +304,13 @@
                     (uint32_t *)&arguments->scalarOutput[0]);
             break;
         case kPMSetMaintenanceWakeCalendar:
-            ret = this->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:
@@ -325,10 +333,11 @@
             break;
 
         case kPMGetSystemSleepType:
-            if (1 == arguments->scalarOutputCount)
+            if (2 == arguments->scalarOutputCount)
             {
                 ret = this->secureGetSystemSleepType(
-                        (uint32_t *) &arguments->scalarOutput[0]);
+                        (uint32_t *) &arguments->scalarOutput[0],
+                        (uint32_t *) &arguments->scalarOutput[1]);
             }
             break;