int _kernelrpc_mach_port_destruct_trap(struct _kernelrpc_mach_port_destruct_args *args) { task_t task = port_name_to_task(args->target); int rv = MACH_SEND_INVALID_DEST; if (task != current_task()) goto done; rv = mach_port_destruct(task->itk_space, args->name, args->srdelta, args->guard); done: if (task) task_deallocate(task); return (rv); }
void destruct_guarded_mach_port() { mach_port_t port; mach_port_options_t options; mach_port_context_t gval = CONTEXT_VALUE1; int kret; printf("Destructing guarded mach port with correct guard: "); options.flags = (MPO_CONTEXT_AS_GUARD); kret = mach_port_construct(mach_task_self(), &options, gval, &port); if (kret != KERN_SUCCESS) exit(1); kret = mach_port_destruct(mach_task_self(), port, 0, gval); if (kret == KERN_SUCCESS) printf("[PASSED]\n"); else goto failed; printf("Destructing guarded mach ports with incorrect send right count: "); options.flags = (MPO_CONTEXT_AS_GUARD); kret = mach_port_construct(mach_task_self(), &options, gval, &port); if (kret != KERN_SUCCESS) exit(1); kret = mach_port_destruct(mach_task_self(), port, -1, gval); if (kret != KERN_SUCCESS) printf("[PASSED]\n"); else goto failed; printf("Destructing guarded mach ports with correct send right and correct guard: "); options.flags = (MPO_CONTEXT_AS_GUARD|MPO_INSERT_SEND_RIGHT); kret = mach_port_construct(mach_task_self(), &options, gval, &port); if (kret != KERN_SUCCESS) exit(1); kret = mach_port_destruct(mach_task_self(), port, -1, gval); if (kret == KERN_SUCCESS) printf("[PASSED]\n"); else goto failed; printf("Destructing guarded mach port with incorrect guard (Expecting exception)...\n"); kret = mach_port_construct(mach_task_self(), &options, gval, &port); if (kret != KERN_SUCCESS) exit(1); kret = mach_port_destruct(mach_task_self(), port, 0, 0); if (kret == KERN_SUCCESS) goto failed; return; failed: printf("[FAILED]\n"); exit(1); }