Loading...
iokit/Kernel/IOWorkLoop.cpp xnu-12377.121.6 xnu-6153.41.3
--- xnu/xnu-12377.121.6/iokit/Kernel/IOWorkLoop.cpp
+++ xnu/xnu-6153.41.3/iokit/Kernel/IOWorkLoop.cpp
@@ -47,9 +47,9 @@
 OSMetaClassDefineReservedUnused(IOWorkLoop, 1);
 OSMetaClassDefineReservedUnused(IOWorkLoop, 2);
 #else
-OSMetaClassDefineReservedUsedX86(IOWorkLoop, 0);
-OSMetaClassDefineReservedUsedX86(IOWorkLoop, 1);
-OSMetaClassDefineReservedUsedX86(IOWorkLoop, 2);
+OSMetaClassDefineReservedUsed(IOWorkLoop, 0);
+OSMetaClassDefineReservedUsed(IOWorkLoop, 1);
+OSMetaClassDefineReservedUsed(IOWorkLoop, 2);
 #endif
 OSMetaClassDefineReservedUnused(IOWorkLoop, 3);
 OSMetaClassDefineReservedUnused(IOWorkLoop, 4);
@@ -133,7 +133,12 @@
 
 	// Allocate our ExpansionData if it hasn't been allocated already.
 	if (!reserved) {
-		reserved = IOMallocType(ExpansionData);
+		reserved = IONew(ExpansionData, 1);
+		if (!reserved) {
+			return false;
+		}
+
+		bzero(reserved, sizeof(ExpansionData));
 	}
 
 	if (gateLock == NULL) {
@@ -198,7 +203,12 @@
 	IOWorkLoop *me = new IOWorkLoop;
 
 	if (me && options) {
-		me->reserved = IOMallocType(ExpansionData);
+		me->reserved = IONew(ExpansionData, 1);
+		if (!me->reserved) {
+			me->release();
+			return NULL;
+		}
+		bzero(me->reserved, sizeof(ExpansionData));
 		me->reserved->options = options;
 	}
 
@@ -210,29 +220,6 @@
 	return me;
 }
 
-void
-IOWorkLoop::releaseEventChain(LIBKERN_CONSUMED IOEventSource *eventChain)
-{
-	IOEventSource *event, *next;
-	for (event = eventChain; event; event = next) {
-		next = event->getNext();
-#ifdef __clang_analyzer__
-		// Unlike the usual IOKit memory management convention, IOWorkLoop
-		// manages the retain count for the IOEventSource instances in the
-		// the chain rather than have IOEventSource do that itself. This means
-		// it is safe to call release() on the result of getNext() while the
-		// chain is being torn down. However, the analyzer doesn't
-		// realize this. We add an extra retain under analysis to suppress
-		// an analyzer diagnostic about violations of the memory management rules.
-		if (next) {
-			next->retain();
-		}
-#endif
-		event->setWorkLoop(NULL);
-		event->setNext(NULL);
-		event->release();
-	}
-}
 // Free is called twice:
 // First when the atomic retainCount transitions from 1 -> 0
 // Secondly when the work loop itself is commiting hari kari
@@ -259,10 +246,22 @@
 
 		openGate();
 	} else { /* !workThread */
-		releaseEventChain(eventChain);
+		IOEventSource *event, *next;
+
+		for (event = eventChain; event; event = next) {
+			next = event->getNext();
+			event->setWorkLoop(NULL);
+			event->setNext(NULL);
+			event->release();
+		}
 		eventChain = NULL;
 
-		releaseEventChain(passiveEventChain);
+		for (event = passiveEventChain; event; event = next) {
+			next = event->getNext();
+			event->setWorkLoop(NULL);
+			event->setNext(NULL);
+			event->release();
+		}
 		passiveEventChain = NULL;
 
 		// Either we have a partial initialization to clean up
@@ -288,7 +287,7 @@
 		IOStatisticsUnregisterCounter();
 
 		if (reserved) {
-			IOFreeType(reserved, ExpansionData);
+			IODelete(reserved, ExpansionData, 1);
 			reserved = NULL;
 		}