1 #include <darwintest.h>
2 #include <servers/bootstrap.h>
4 #include <mach/message.h>
6 #include <sys/sysctl.h>
9 #include <mach/mach_port.h>
11 T_GLOBAL_META(T_META_RUN_CONCURRENTLY(true));
13 T_DECL(immovable_rights
, "Create a port with immovable receive rights") {
15 mach_port_options_t opts
= {
16 .flags
= MPO_CONTEXT_AS_GUARD
| MPO_IMMOVABLE_RECEIVE
20 kr
= mach_port_construct(mach_task_self(), &opts
, 0x10, &imm_port
);
21 T_QUIET
; T_ASSERT_MACH_SUCCESS(kr
, "mach_port_construct");
23 mach_port_status_t status
;
24 mach_msg_type_number_t status_size
= MACH_PORT_RECEIVE_STATUS_COUNT
;
25 kr
= mach_port_get_attributes(mach_task_self(), imm_port
,
26 MACH_PORT_RECEIVE_STATUS
, (mach_port_info_t
)&status
, &status_size
);
27 T_QUIET
; T_ASSERT_MACH_SUCCESS(kr
, "mach_port_get_attributes");
28 T_LOG("Status flags %d", status
.mps_flags
);
29 T_ASSERT_NE(0, (status
.mps_flags
& MACH_PORT_STATUS_FLAG_GUARD_IMMOVABLE_RECEIVE
), "Imm rcv bit is set");
31 mach_port_t imm_port2
;
32 mach_port_options_t opts2
= {};
34 kr
= mach_port_construct(mach_task_self(), &opts2
, 0, &imm_port2
);
35 T_QUIET
; T_ASSERT_MACH_SUCCESS(kr
, "mach_port_construct");
37 kr
= mach_port_guard_with_flags(mach_task_self(), imm_port2
, 0x11, (uint64_t)MPG_IMMOVABLE_RECEIVE
);
38 T_QUIET
; T_ASSERT_MACH_SUCCESS(kr
, "mach_port_guard_with_flags");
40 kr
= mach_port_get_attributes(mach_task_self(), imm_port2
,
41 MACH_PORT_RECEIVE_STATUS
, (mach_port_info_t
)&status
, &status_size
);
42 T_QUIET
; T_ASSERT_MACH_SUCCESS(kr
, "mach_port_get_attributes");
43 T_LOG("Status flags %d", status
.mps_flags
);
44 T_ASSERT_NE(0, (status
.mps_flags
& MACH_PORT_STATUS_FLAG_GUARD_IMMOVABLE_RECEIVE
), "Imm rcv bit is set");
46 kr
= mach_port_swap_guard(mach_task_self(), imm_port2
, 0x11, 0xde18);
47 T_ASSERT_MACH_SUCCESS(kr
, "mach_port_swap_guard");
49 kr
= mach_port_unguard(mach_task_self(), imm_port2
, 0xde18);
50 T_ASSERT_MACH_SUCCESS(kr
, "mach_port_unguard");