kern_return_t mach_port_extract_right( ipc_space_t space, mach_port_name_t name, mach_msg_type_name_t msgt_name, ipc_port_t *poly, mach_msg_type_name_t *polyPoly) { kern_return_t kr; if (space == IS_NULL) return KERN_INVALID_TASK; if (!MACH_MSG_TYPE_PORT_ANY(msgt_name)) return KERN_INVALID_VALUE; if (!MACH_PORT_VALID(name)) { /* * really should copy out a dead name, if it is a send or * send-once right being copied, but instead return an * error for now. */ return KERN_INVALID_RIGHT; } kr = ipc_object_copyin(space, name, msgt_name, (ipc_object_t *) poly); if (kr == KERN_SUCCESS) *polyPoly = ipc_object_copyin_type(msgt_name); return kr; }
int _kernelrpc_mach_port_insert_right_trap(struct _kernelrpc_mach_port_insert_right_args *args) { task_t task = port_name_to_task(args->target); ipc_port_t port; mach_msg_type_name_t disp; int rv = MACH_SEND_INVALID_DEST; if (task != current_task()) goto done; rv = ipc_object_copyin(task->itk_space, args->poly, args->polyPoly, (ipc_object_t *)&port); if (rv != KERN_SUCCESS) goto done; disp = ipc_object_copyin_type(args->polyPoly); rv = mach_port_insert_right(task->itk_space, args->name, port, disp); done: if (task) task_deallocate(task); return (rv); }