Loading...
iokit/Kernel/IOUserClient.cpp xnu-792.21.3 xnu-517
--- xnu/xnu-792.21.3/iokit/Kernel/IOUserClient.cpp
+++ xnu/xnu-517/iokit/Kernel/IOUserClient.cpp
@@ -1,19 +1,16 @@
 /*
- * Copyright (c) 1998-2004 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
  * 
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. The rights granted to you under the License
- * may not be used to create, or enable the creation or redistribution of,
- * unlawful or unlicensed copies of an Apple operating system, or to
- * circumvent, violate, or enable the circumvention or violation of, any
- * terms of an Apple operating system software license agreement.
- * 
- * Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
  * 
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
@@ -23,12 +20,11 @@
  * Please see the License for the specific language governing rights and
  * limitations under the License.
  * 
- * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
+ * @APPLE_LICENSE_HEADER_END@
  */
 
 
 #include <IOKit/IOKitServer.h>
-#include <IOKit/IOKitKeysPrivate.h>
 #include <IOKit/IOUserClient.h>
 #include <IOKit/IOService.h>
 #include <IOKit/IOService.h>
@@ -62,8 +58,6 @@
 extern mach_port_name_t iokit_make_send_right( task_t task,
 				io_object_t obj, ipc_kobject_type_t type );
 
-extern kern_return_t iokit_mod_send_right( task_t task, mach_port_name_t name, mach_port_delta_t delta );
-
 extern io_object_t iokit_lookup_connect_ref(io_object_t clientRef, ipc_space_t task);
 
 extern io_object_t iokit_lookup_connect_ref_current_task(io_object_t clientRef);
@@ -75,7 +69,6 @@
 
 extern kern_return_t iokit_switch_object_port( ipc_port_t port, io_object_t obj, ipc_kobject_type_t type );
 
-#include <mach/mach_traps.h>
 #include <vm/vm_map.h>
 
 } /* extern "C" */
@@ -393,7 +386,7 @@
         OSNotificationHeader		notifyHeader;
     };
 
-    enum { kMaxOutstanding = 1024 };
+    enum { kMaxOutstanding = 256 };
 
     PingMsg *		pingMsg;
     vm_size_t		msgSize;
@@ -764,75 +757,48 @@
     asyncRef[kIOAsyncCalloutRefconIndex] = (natural_t) refcon;
 }
 
-inline OSDictionary * CopyConsoleUser(UInt32 uid)
-{
-	OSArray * array;
-	OSDictionary * user = 0; 
+IOReturn IOUserClient::clientHasPrivilege( void * securityToken,
+                                            const char * privilegeName )
+{
+    kern_return_t	   kr;
+    security_token_t	   token;
+    mach_msg_type_number_t count;
+
+    count = TASK_SECURITY_TOKEN_COUNT;
+    kr = task_info( (task_t) securityToken, TASK_SECURITY_TOKEN,
+		    (task_info_t) &token, &count );
+
+    if (KERN_SUCCESS != kr)
+    {}
+    else if (!strcmp(privilegeName, kIOClientPrivilegeAdministrator))
+    {
+	if (0 != token.val[0])
+	    kr = kIOReturnNotPrivileged;
+    }
+    else if (!strcmp(privilegeName, kIOClientPrivilegeLocalUser))
+    {
+	OSArray *      array;
+	OSDictionary * user = 0;
 
 	if ((array = OSDynamicCast(OSArray,
 	    IORegistryEntry::getRegistryRoot()->copyProperty(gIOConsoleUsersKey))))
 	{
 	    for (unsigned int idx = 0;
 		    (user = OSDynamicCast(OSDictionary, array->getObject(idx)));
-		    idx++) {
-            OSNumber * num;
-            
-            if ((num = OSDynamicCast(OSNumber, user->getObject(gIOConsoleSessionUIDKey)))
-              && (uid == num->unsigned32BitValue())) {
-                user->retain();
-                break;
-            }
+		    idx++)
+	    {
+		OSNumber * num;
+		if ((num = OSDynamicCast(OSNumber, user->getObject(gIOConsoleSessionUIDKey)))
+		  && (token.val[0] == num->unsigned32BitValue()))
+		    break;
 	    }
 	    array->release();
 	}
-    return user;
-}
-
-IOReturn IOUserClient::clientHasPrivilege( void * securityToken,
-                                            const char * privilegeName )
-{
-    kern_return_t           kr;
-    security_token_t        token;
-    mach_msg_type_number_t  count;
-    task_t                  task;
-    OSDictionary *          user;
-    bool                    secureConsole;
-
-    if ((secureConsole = !strcmp(privilegeName, kIOClientPrivilegeSecureConsoleProcess)))
-        task = (task_t)((IOUCProcessToken *)securityToken)->token;
+	if (!user)
+	    kr = kIOReturnNotPrivileged;
+    }
     else
-        task = (task_t)securityToken;
-    
-    count = TASK_SECURITY_TOKEN_COUNT;
-    kr = task_info( task, TASK_SECURITY_TOKEN, (task_info_t) &token, &count );
-
-    if (KERN_SUCCESS != kr)
-    {}
-    else if (!strcmp(privilegeName, kIOClientPrivilegeAdministrator)) {
-        if (0 != token.val[0])
-            kr = kIOReturnNotPrivileged;
-    } else if (!strcmp(privilegeName, kIOClientPrivilegeLocalUser)) {
-        user = CopyConsoleUser(token.val[0]);
-        if ( user )
-            user->release();
-        else
-            kr = kIOReturnNotPrivileged;            
-    } else if (secureConsole || !strcmp(privilegeName, kIOClientPrivilegeConsoleUser)) {
-        user = CopyConsoleUser(token.val[0]);
-        if ( user ) {
-            if (user->getObject(gIOConsoleSessionOnConsoleKey) != kOSBooleanTrue)
-                kr = kIOReturnNotPrivileged;
-            else if ( secureConsole ) {
-                OSNumber * pid = OSDynamicCast(OSNumber, user->getObject(gIOConsoleSessionSecureInputPIDKey));
-                if ( pid && pid->unsigned32BitValue() != ((IOUCProcessToken *)securityToken)->pid)
-                    kr = kIOReturnNotPrivileged;
-            }
-            user->release();
-        }
-        else 
-            kr = kIOReturnNotPrivileged;
-    } else
-        kr = kIOReturnUnsupported;
+	kr = kIOReturnUnsupported;
 
     return (kr);
 }
@@ -1052,98 +1018,11 @@
 	io_object_t object,
 	io_name_t className )
 {
-	const OSMetaClass* my_obj = NULL;
-
     if( !object)
         return( kIOReturnBadArgument );
-		
-	my_obj = object->getMetaClass();
-	if (!my_obj) {
-		return (kIOReturnNotFound);
-	}
-	
-    strcpy( className, my_obj->getClassName());
+
+    strcpy( className, object->getMetaClass()->getClassName());
     return( kIOReturnSuccess );
-}
-
-/* Routine io_object_get_superclass */
-kern_return_t is_io_object_get_superclass(
-	mach_port_t master_port,
-	io_name_t obj_name, 
-	io_name_t class_name)
-{
-	const OSMetaClass* my_obj = NULL;
-	const OSMetaClass* superclass = NULL;
-	const OSSymbol *my_name = NULL;
-	const char *my_cstr = NULL;
-
-	if (!obj_name || !class_name) 
-		return (kIOReturnBadArgument);
-
-    if( master_port != master_device_port)
-        return( kIOReturnNotPrivileged);
-
-	my_name = OSSymbol::withCString(obj_name);
-	
-	if (my_name) {
-		my_obj = OSMetaClass::getMetaClassWithName(my_name);
-		my_name->release();
-	}
-	if (my_obj) {
-		superclass = my_obj->getSuperClass();
-	}
-	
-	if (!superclass)  {
-		return( kIOReturnNotFound );
-	}
-
-	my_cstr = superclass->getClassName();
-		
-	if (my_cstr) {
-		strncpy(class_name, my_cstr, sizeof(io_name_t)-1);
-		return( kIOReturnSuccess );
-	}
-	return (kIOReturnNotFound);
-}
-
-/* Routine io_object_get_bundle_identifier */
-kern_return_t is_io_object_get_bundle_identifier(
-	mach_port_t master_port,
-	io_name_t obj_name, 
-	io_name_t bundle_name)
-{
-	const OSMetaClass* my_obj = NULL;
-	const OSSymbol *my_name = NULL;
-	const OSSymbol *identifier = NULL;
-	const char *my_cstr = NULL;
-
-	if (!obj_name || !bundle_name) 
-		return (kIOReturnBadArgument);
-
-    if( master_port != master_device_port)
-        return( kIOReturnNotPrivileged);
-	
-	my_name = OSSymbol::withCString(obj_name);	
-	
-	if (my_name) {
-		my_obj = OSMetaClass::getMetaClassWithName(my_name);
-		my_name->release();
-	}
-
-	if (my_obj) {
-		identifier = my_obj->getKmodName();
-	}
-	if (!identifier) {
-		return( kIOReturnNotFound );
-	}
-	
-	my_cstr = identifier->getCStringNoCopy();
-	if (my_cstr) {
-		strncpy(bundle_name, identifier->getCStringNoCopy(), sizeof(io_name_t)-1);
-		return( kIOReturnSuccess );
-	}
-
-	return (kIOReturnBadArgument);
 }
 
 /* Routine io_object_conforms_to */
@@ -1248,10 +1127,8 @@
 {
     kern_return_t	kr;
     vm_offset_t 	data;
-    vm_map_offset_t	map_data;
-
-    kr = vm_map_copyout( kernel_map, &map_data, (vm_map_copy_t) matching );
-    data = CAST_DOWN(vm_offset_t, map_data);
+
+    kr = vm_map_copyout( kernel_map, &data, (vm_map_copy_t) matching );
 
     if( KERN_SUCCESS == kr) {
         // must return success after vm_map_copyout() succeeds
@@ -1300,10 +1177,8 @@
 {
     kern_return_t	kr;
     vm_offset_t 	data;
-    vm_map_offset_t	map_data;
-
-    kr = vm_map_copyout( kernel_map, &map_data, (vm_map_copy_t) matching );
-    data = CAST_DOWN(vm_offset_t, map_data);
+
+    kr = vm_map_copyout( kernel_map, &data, (vm_map_copy_t) matching );
 
     if( KERN_SUCCESS == kr) {
         // must return success after vm_map_copyout() succeeds
@@ -1403,10 +1278,8 @@
 {
     kern_return_t	kr;
     vm_offset_t 	data;
-    vm_map_offset_t	map_data;
-
-    kr = vm_map_copyout( kernel_map, &map_data, (vm_map_copy_t) matching );
-    data = CAST_DOWN(vm_offset_t, map_data);
+
+    kr = vm_map_copyout( kernel_map, &data, (vm_map_copy_t) matching );
 
     if( KERN_SUCCESS == kr) {
         // must return success after vm_map_copyout() succeeds
@@ -1688,7 +1561,7 @@
     kern_return_t	err;
     vm_map_copy_t	copy;
 
-    err = vm_map_copyin( kernel_map, CAST_USER_ADDR_T(data), len,
+    err = vm_map_copyin( kernel_map, (vm_offset_t) data, len,
                     false /* src_destroy */, &copy);
 
     assert( err == KERN_SUCCESS );
@@ -1882,12 +1755,10 @@
     kern_return_t	err;
     IOReturn		res;
     vm_offset_t 	data;
-    vm_map_offset_t	map_data;
 
     CHECK( IORegistryEntry, registry_entry, entry );
 
-    err = vm_map_copyout( kernel_map, &map_data, (vm_map_copy_t) properties );
-    data = CAST_DOWN(vm_offset_t, map_data);
+    err = vm_map_copyout( kernel_map, &data, (vm_map_copy_t) properties );
 
     if( KERN_SUCCESS == err) {
 
@@ -2097,33 +1968,6 @@
     return( err );
 }
 
-IOMemoryMap * IOUserClient::removeMappingForDescriptor(IOMemoryDescriptor * mem)
-{
-    OSIterator *  iter;
-    IOMemoryMap * map = 0;
-
-    IOLockLock(gIOObjectPortLock);
-
-    iter = OSCollectionIterator::withCollection(mappings);
-    if(iter)
-    {
-        while ((map = OSDynamicCast(IOMemoryMap, iter->getNextObject())))
-        {
-            if(mem == map->getMemoryDescriptor())
-            {
-                map->retain();
-                mappings->removeObject(map);
-                break;
-            }
-        }
-        iter->release();
-    }
-
-    IOLockUnlock(gIOObjectPortLock);
-
-    return (map);
-}
-
 kern_return_t is_io_connect_unmap_memory(
 	io_object_t     connect,
 	int		type,
@@ -2146,28 +1990,14 @@
 
 	map = memory->map( task, mapAddr, options );
 	memory->release();
-        if( map)
-	{
+        if( map) {
             IOLockLock( gIOObjectPortLock);
             if( client->mappings)
                 client->mappings->removeObject( map);
             IOLockUnlock( gIOObjectPortLock);
-
-	    mach_port_name_t name = 0;
-	    if (task != current_task())
-		name = IOMachPort::makeSendRightForTask( task, map, IKOT_IOKIT_OBJECT );
-	    if (name)
-	    {
-		map->unmap();
-		err = iokit_mod_send_right( task, name, -2 );
-		err = kIOReturnSuccess;
-	    }
-	    else
-		IOMachPort::releasePortForObject( map, IKOT_IOKIT_OBJECT );
-	    if (task == current_task())
-		map->release();
-        }
-	else
+            IOMachPort::releasePortForObject( map, IKOT_IOKIT_OBJECT );
+            map->release();
+        } else
             err = kIOReturnBadArgument;
     }
 
@@ -2844,12 +2674,8 @@
     if(flag != kIOCatalogRemoveKernelLinker && ( !inData || !inDataCount) )
         return kIOReturnBadArgument;
 
-    if (inData) {
-        vm_map_offset_t map_data;
-
-        kr = vm_map_copyout( kernel_map, &map_data, (vm_map_copy_t)inData);
-	data = CAST_DOWN(vm_offset_t, map_data);
-
+    if (data) {
+        kr = vm_map_copyout( kernel_map, &data, (vm_map_copy_t)inData);
         if( kr != KERN_SUCCESS)
             return kr;
 
@@ -3019,11 +2845,10 @@
         vm_size_t size;
 
         size = s->getLength();
-        kr = vm_allocate(kernel_map, &data, size, VM_FLAGS_ANYWHERE);
+        kr = vm_allocate(kernel_map, &data, size, true);
         if ( kr == kIOReturnSuccess ) {
             bcopy(s->text(), (void *)data, size);
-            kr = vm_map_copyin(kernel_map, (vm_map_address_t)data,
-			       (vm_map_size_t)size, true, &copy);
+            kr = vm_map_copyin(kernel_map, data, size, true, &copy);
             *outData = (char *)copy;
             *outDataCount = size;
         }
@@ -3089,17 +2914,19 @@
     return kIOReturnSuccess;
 }
 
-kern_return_t iokit_user_client_trap(struct iokit_user_client_trap_args *args)
+kern_return_t iokit_user_client_trap(io_object_t userClientRef, UInt32 index,
+                                    void *p1, void *p2, void *p3,
+                                    void *p4, void *p5, void *p6)
 {
     kern_return_t result = kIOReturnBadArgument;
     IOUserClient *userClient;
 
     if ((userClient = OSDynamicCast(IOUserClient,
-            iokit_lookup_connect_ref_current_task((OSObject *)(args->userClientRef))))) {
+            iokit_lookup_connect_ref_current_task(userClientRef)))) {
         IOExternalTrap *trap;
         IOService *target = NULL;
 
-        trap = userClient->getTargetAndTrapForIndex(&target, args->index);
+        trap = userClient->getTargetAndTrapForIndex(&target, index);
 
         if (trap && target) {
             IOTrap func;
@@ -3107,7 +2934,7 @@
             func = trap->func;
 
             if (func) {
-                result = (target->*func)(args->p1, args->p2, args->p3, args->p4, args->p5, args->p6);
+                result = (target->*func)(p1, p2, p3, p4, p5, p6);
             }
         }