]>
Commit | Line | Data |
---|---|---|
1 | #ifdef T_NAMESPACE | |
2 | #undef T_NAMESPACE | |
3 | #endif | |
4 | #define T_NAMESPACE "xnu.ipc" | |
5 | #include <darwintest.h> | |
6 | #include <mach/mach.h> | |
7 | #include <stdlib.h> | |
8 | #include <stdio.h> | |
9 | ||
10 | ||
11 | T_DECL(mach_port_mod_refs, "mach_port_mod_refs"){ | |
12 | mach_port_t port_set; | |
13 | mach_port_t port; | |
14 | int ret; | |
15 | ||
16 | ret = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_PORT_SET, &port_set); | |
17 | T_ASSERT_MACH_SUCCESS(ret, "mach_port_allocate MACH_PORT_RIGHT_PORT_SET"); | |
18 | ||
19 | ret = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); | |
20 | T_ASSERT_MACH_SUCCESS(ret, "mach_port_allocate MACH_PORT_RIGHT_RECEIVE"); | |
21 | ||
22 | ||
23 | /* | |
24 | * Test all known variants of port rights on each type of port | |
25 | */ | |
26 | ||
27 | /* can't subtract a send right if it doesn't exist */ | |
28 | ret = mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_SEND, -1); | |
29 | T_ASSERT_EQ(ret, KERN_INVALID_RIGHT, "mach_port_mod_refs SEND: -1 on a RECV right"); | |
30 | ||
31 | /* can't subtract a send once right if it doesn't exist */ | |
32 | ret = mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_SEND_ONCE, -1); | |
33 | T_ASSERT_EQ(ret, KERN_INVALID_RIGHT, "mach_port_mod_refs SEND_ONCE: -1 on a RECV right"); | |
34 | ||
35 | /* can't subtract a PORT SET right if it's not a port set */ | |
36 | ret = mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_PORT_SET, -1); | |
37 | T_ASSERT_EQ(ret, KERN_INVALID_RIGHT, "mach_port_mod_refs PORT_SET: -1 on a RECV right"); | |
38 | ||
39 | /* can't subtract a dead name right if it doesn't exist */ | |
40 | ret = mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_DEAD_NAME, -1); | |
41 | T_ASSERT_EQ(ret, KERN_INVALID_RIGHT, "mach_port_mod_refs DEAD_NAME: -1 on a RECV right"); | |
42 | ||
43 | /* can't subtract a LABELH right if it doesn't exist */ | |
44 | ret = mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_LABELH, -1); | |
45 | T_ASSERT_EQ(ret, KERN_INVALID_RIGHT, "mach_port_mod_refs LABELH: -1 on a RECV right"); | |
46 | ||
47 | /* can't subtract an invalid right-type */ | |
48 | ret = mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_NUMBER, -1); | |
49 | T_ASSERT_EQ(ret, KERN_INVALID_VALUE, "mach_port_mod_refs NUMBER: -1 on a RECV right"); | |
50 | ||
51 | /* can't subtract an invalid right-type */ | |
52 | ret = mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_NUMBER + 1, -1); | |
53 | T_ASSERT_EQ(ret, KERN_INVALID_VALUE, "mach_port_mod_refs NUMBER+1: -1 on a RECV right"); | |
54 | ||
55 | ||
56 | /* can't subtract a send right if it doesn't exist */ | |
57 | ret = mach_port_mod_refs(mach_task_self(), port_set, MACH_PORT_RIGHT_SEND, -1); | |
58 | T_ASSERT_EQ(ret, KERN_INVALID_RIGHT, "mach_port_mod_refs SEND: -1 on a PORT_SET right"); | |
59 | ||
60 | /* can't subtract a send once right if it doesn't exist */ | |
61 | ret = mach_port_mod_refs(mach_task_self(), port_set, MACH_PORT_RIGHT_SEND_ONCE, -1); | |
62 | T_ASSERT_EQ(ret, KERN_INVALID_RIGHT, "mach_port_mod_refs SEND_ONCE: -1 on a PORT_SET right"); | |
63 | ||
64 | /* can't subtract a receive right if it's a port set */ | |
65 | ret = mach_port_mod_refs(mach_task_self(), port_set, MACH_PORT_RIGHT_RECEIVE, -1); | |
66 | T_ASSERT_EQ(ret, KERN_INVALID_RIGHT, "mach_port_mod_refs RECV: -1 on a PORT_SET right"); | |
67 | ||
68 | /* can't subtract a dead name right if it doesn't exist */ | |
69 | ret = mach_port_mod_refs(mach_task_self(), port_set, MACH_PORT_RIGHT_DEAD_NAME, -1); | |
70 | T_ASSERT_EQ(ret, KERN_INVALID_RIGHT, "mach_port_mod_refs DEAD_NAME: -1 on a PORT_SET right"); | |
71 | ||
72 | /* can't subtract a LABELH right if it doesn't exist */ | |
73 | ret = mach_port_mod_refs(mach_task_self(), port_set, MACH_PORT_RIGHT_LABELH, -1); | |
74 | T_ASSERT_EQ(ret, KERN_INVALID_RIGHT, "mach_port_mod_refs LABELH: -1 on a PORT_SET right"); | |
75 | ||
76 | /* can't subtract an invalid right-type */ | |
77 | ret = mach_port_mod_refs(mach_task_self(), port_set, MACH_PORT_RIGHT_NUMBER, -1); | |
78 | T_ASSERT_EQ(ret, KERN_INVALID_VALUE, "mach_port_mod_refs NUMBER: -1 on a PORT_SET right"); | |
79 | ||
80 | /* can't subtract an invalid right-type */ | |
81 | ret = mach_port_mod_refs(mach_task_self(), port_set, MACH_PORT_RIGHT_NUMBER + 1, -1); | |
82 | T_ASSERT_EQ(ret, KERN_INVALID_VALUE, "mach_port_mod_refs NUMBER+1: -1 on a PORT_SET right"); | |
83 | ||
84 | /* | |
85 | * deallocate the ports/sets | |
86 | */ | |
87 | ret= mach_port_mod_refs(mach_task_self(), port_set, MACH_PORT_RIGHT_PORT_SET, -1); | |
88 | T_ASSERT_MACH_SUCCESS(ret, "mach_port_mod_refs(PORT_SET, -1)"); | |
89 | ||
90 | ret= mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_RECEIVE, -1); | |
91 | T_ASSERT_MACH_SUCCESS(ret, "mach_port_mod_refs(RECV_RIGHT, -1)"); | |
92 | } |