Esempio n. 1
0
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);
}
Esempio n. 2
0
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);

}