virtual void reset() APPLE_KEXT_OVERRIDE;
virtual bool isValid() APPLE_KEXT_OVERRIDE;
virtual OSObject * getNextObject() APPLE_KEXT_OVERRIDE;
+ virtual OSObject * copyNextObject();
};
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
OSObject *
IOUserIterator::getNextObject()
{
- OSObject * ret;
+ assert(false);
+ return (NULL);
+}
+
+OSObject *
+IOUserIterator::copyNextObject()
+{
+ OSObject * ret = NULL;
IOLockLock(lock);
- assert(OSDynamicCast(OSIterator, userIteratorObject));
- ret = ((OSIterator *)userIteratorObject)->getNextObject();
+ if (userIteratorObject) {
+ ret = ((OSIterator *)userIteratorObject)->getNextObject();
+ if (ret) ret->retain();
+ }
IOLockUnlock(lock);
return (ret);
PingMsg * pingMsg;
vm_size_t msgSize;
OSArray * newSet;
- OSObject * lastEntry;
bool armed;
bool ipcLogged;
virtual bool handler( void * ref, IOService * newService );
virtual OSObject * getNextObject() APPLE_KEXT_OVERRIDE;
+ virtual OSObject * copyNextObject() APPLE_KEXT_OVERRIDE;
};
class IOServiceMessageUserNotification : public IOUserNotification
void * messageArgument, vm_size_t argSize );
virtual OSObject * getNextObject() APPLE_KEXT_OVERRIDE;
+ virtual OSObject * copyNextObject() APPLE_KEXT_OVERRIDE;
};
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
PingMsg * _pingMsg;
vm_size_t _msgSize;
OSArray * _newSet;
- OSObject * _lastEntry;
_pingMsg = pingMsg;
_msgSize = msgSize;
- _lastEntry = lastEntry;
_newSet = newSet;
super::free();
IOFree(_pingMsg, _msgSize);
}
- if( _lastEntry)
- _lastEntry->release();
-
if( _newSet)
_newSet->release();
}
return( true );
}
-
OSObject * IOServiceUserNotification::getNextObject()
+{
+ assert(false);
+ return (NULL);
+}
+
+OSObject * IOServiceUserNotification::copyNextObject()
{
unsigned int count;
OSObject * result;
- OSObject * releaseEntry;
IOLockLock(lock);
- releaseEntry = lastEntry;
count = newSet->getCount();
if( count ) {
result = newSet->getObject( count - 1 );
result = 0;
armed = true;
}
- lastEntry = result;
IOLockUnlock(lock);
- if (releaseEntry) releaseEntry->release();
-
return( result );
}
return( 0 );
}
+OSObject * IOServiceMessageUserNotification::copyNextObject()
+{
+ return( NULL );
+}
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#undef super
if (newOwner)
{
owner = IONew(IOUserClientOwner, 1);
- if (!newOwner) ret = kIOReturnNoMemory;
+ if (!owner) ret = kIOReturnNoMemory;
else
{
owner->task = task;
{
IOReturn ret;
OSObject * obj;
+ OSIterator * iter;
+ IOUserIterator * uiter;
- CHECK( OSIterator, iterator, iter );
+ if ((uiter = OSDynamicCast(IOUserIterator, iterator)))
+ {
+ obj = uiter->copyNextObject();
+ }
+ else if ((iter = OSDynamicCast(OSIterator, iterator)))
+ {
+ obj = iter->getNextObject();
+ if (obj) obj->retain();
+ }
+ else
+ {
+ return( kIOReturnBadArgument );
+ }
- obj = iter->getNextObject();
if( obj) {
- obj->retain();
*object = obj;
ret = kIOReturnSuccess;
} else
{
CHECK( IORegistryEntry, registry_entry, entry );
- *iterator = entry->getChildIterator(
- IORegistryEntry::getPlane( plane ));
+ *iterator = IOUserIterator::withIterator(entry->getChildIterator(
+ IORegistryEntry::getPlane( plane )));
return( kIOReturnSuccess );
}
{
CHECK( IORegistryEntry, registry_entry, entry );
- *iterator = entry->getParentIterator(
- IORegistryEntry::getPlane( plane ));
+ *iterator = IOUserIterator::withIterator(entry->getParentIterator(
+ IORegistryEntry::getPlane( plane )));
return( kIOReturnSuccess );
}
return kIOReturnBadArgument;
}
- if (!IOTaskHasEntitlement(current_task(), "com.apple.rootless.kext-management"))
+ if (!IOTaskHasEntitlement(current_task(), "com.apple.rootless.kext-secure-management"))
{
OSString * taskName = IOCopyLogNameForPID(proc_selfpid());
IOLog("IOCatalogueSendData(%s): Not entitled\n", taskName ? taskName->getCStringNoCopy() : "");