xref: /xnu-8796.121.2/tests/audit_session.c (revision c54f35ca767986246321eb901baf8f5ff7923f6a)
1*c54f35caSApple OSS Distributions #pragma clang diagnostic ignored "-Wdeprecated-declarations"
2*c54f35caSApple OSS Distributions 
3*c54f35caSApple OSS Distributions #include <bsm/audit.h>
4*c54f35caSApple OSS Distributions #include <bsm/audit_session.h>
5*c54f35caSApple OSS Distributions #include <err.h>
6*c54f35caSApple OSS Distributions #include <sysexits.h>
7*c54f35caSApple OSS Distributions #include <unistd.h>
8*c54f35caSApple OSS Distributions #include <signal.h>
9*c54f35caSApple OSS Distributions #include <errno.h>
10*c54f35caSApple OSS Distributions #include <string.h>
11*c54f35caSApple OSS Distributions 
12*c54f35caSApple OSS Distributions #include <darwintest.h>
13*c54f35caSApple OSS Distributions #include <darwintest_utils.h>
14*c54f35caSApple OSS Distributions #include <darwintest_multiprocess.h>
15*c54f35caSApple OSS Distributions 
16*c54f35caSApple OSS Distributions #define RDAR_104863182
17*c54f35caSApple OSS Distributions 
18*c54f35caSApple OSS Distributions #ifndef INVALID_AUDIT_TOKEN_VALUE
19*c54f35caSApple OSS Distributions #define INVALID_AUDIT_TOKEN_VALUE {{ \
20*c54f35caSApple OSS Distributions 	UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX, \
21*c54f35caSApple OSS Distributions 	UINT_MAX, UINT_MAX, UINT_MAX, UINT_MAX }}
22*c54f35caSApple OSS Distributions #endif
23*c54f35caSApple OSS Distributions 
24*c54f35caSApple OSS Distributions #ifndef PID_MAX
25*c54f35caSApple OSS Distributions #define PID_MAX 99999
26*c54f35caSApple OSS Distributions #endif
27*c54f35caSApple OSS Distributions 
28*c54f35caSApple OSS Distributions #define VALID_AU_SESSION_FLAGS ( \
29*c54f35caSApple OSS Distributions 	        AU_SESSION_FLAG_IS_INITIAL | \
30*c54f35caSApple OSS Distributions 	        AU_SESSION_FLAG_HAS_GRAPHIC_ACCESS | \
31*c54f35caSApple OSS Distributions 	        AU_SESSION_FLAG_HAS_TTY | \
32*c54f35caSApple OSS Distributions 	        AU_SESSION_FLAG_IS_REMOTE | \
33*c54f35caSApple OSS Distributions 	        AU_SESSION_FLAG_HAS_CONSOLE_ACCESS | \
34*c54f35caSApple OSS Distributions 	        AU_SESSION_FLAG_HAS_AUTHENTICATED)
35*c54f35caSApple OSS Distributions 
36*c54f35caSApple OSS Distributions T_GLOBAL_META(
37*c54f35caSApple OSS Distributions 	T_META_RUN_CONCURRENTLY(true),
38*c54f35caSApple OSS Distributions 	T_META_NAMESPACE("xnu.audit.session"));
39*c54f35caSApple OSS Distributions 
40*c54f35caSApple OSS Distributions static void
get_asid_auid(au_asid_t * asidp,au_id_t * auidp)41*c54f35caSApple OSS Distributions get_asid_auid(au_asid_t *asidp, au_id_t *auidp)
42*c54f35caSApple OSS Distributions {
43*c54f35caSApple OSS Distributions 	audit_token_t token = INVALID_AUDIT_TOKEN_VALUE;
44*c54f35caSApple OSS Distributions 	mach_msg_type_number_t count = TASK_AUDIT_TOKEN_COUNT;
45*c54f35caSApple OSS Distributions 	T_ASSERT_MACH_SUCCESS(task_info(mach_task_self(), TASK_AUDIT_TOKEN, (task_info_t)&token, &count), "obtain audit token for self");
46*c54f35caSApple OSS Distributions 	if (asidp) {
47*c54f35caSApple OSS Distributions 		*asidp = (au_asid_t)token.val[6];
48*c54f35caSApple OSS Distributions 	}
49*c54f35caSApple OSS Distributions 	if (auidp) {
50*c54f35caSApple OSS Distributions 		*auidp = (au_id_t)token.val[0];
51*c54f35caSApple OSS Distributions 	}
52*c54f35caSApple OSS Distributions }
53*c54f35caSApple OSS Distributions 
54*c54f35caSApple OSS Distributions T_DECL(getaudit_addr, "getaudit_addr smoke test")
55*c54f35caSApple OSS Distributions {
56*c54f35caSApple OSS Distributions 	au_asid_t asid;
57*c54f35caSApple OSS Distributions 	au_id_t auid;
58*c54f35caSApple OSS Distributions 	get_asid_auid(&asid, &auid);
59*c54f35caSApple OSS Distributions 
60*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia;
61*c54f35caSApple OSS Distributions 	int rv_from_getaudit_addr = getaudit_addr(&aia, sizeof(aia));
62*c54f35caSApple OSS Distributions 	if (rv_from_getaudit_addr == -1 && errno == ENOSYS) {
63*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for getaudit_addr(2) not available");
64*c54f35caSApple OSS Distributions 	}
65*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(rv_from_getaudit_addr, "getaudit_addr(2) succeeds");
66*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_auid, auid, NULL);
67*c54f35caSApple OSS Distributions 	// any ai_mask
68*c54f35caSApple OSS Distributions 	// any ai_termid
69*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_asid, asid, NULL);
70*c54f35caSApple OSS Distributions 	T_EXPECT_BITS_NOTSET(aia.ai_flags, ~(au_asflgs_t)VALID_AU_SESSION_FLAGS, NULL);
71*c54f35caSApple OSS Distributions 	T_EXPECT_BITS_SET(aia.ai_flags, (au_asflgs_t)AU_SESSION_FLAG_HAS_AUTHENTICATED, NULL);
72*c54f35caSApple OSS Distributions }
73*c54f35caSApple OSS Distributions 
74*c54f35caSApple OSS Distributions T_DECL(getauid, "getauid smoke test")
75*c54f35caSApple OSS Distributions {
76*c54f35caSApple OSS Distributions 	au_id_t auid;
77*c54f35caSApple OSS Distributions 	get_asid_auid(NULL, &auid);
78*c54f35caSApple OSS Distributions 
79*c54f35caSApple OSS Distributions 	au_id_t auid2 = 666;
80*c54f35caSApple OSS Distributions 	int rv_from_getauid = getauid(&auid2);
81*c54f35caSApple OSS Distributions 	if (rv_from_getauid == -1 && errno == ENOSYS) {
82*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for getauid(2) not available");
83*c54f35caSApple OSS Distributions 	}
84*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(rv_from_getauid, "getauid(2) succeeds");
85*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(auid2, auid, NULL);
86*c54f35caSApple OSS Distributions }
87*c54f35caSApple OSS Distributions 
88*c54f35caSApple OSS Distributions T_DECL(auditon_getsflags, "auditon(A_GETSFLAGS) smoke test")
89*c54f35caSApple OSS Distributions {
90*c54f35caSApple OSS Distributions 	au_asflgs_t flags = -1UL;
91*c54f35caSApple OSS Distributions 	int rv_from_auditon = auditon(A_GETSFLAGS, &flags, sizeof(flags));
92*c54f35caSApple OSS Distributions 	if (rv_from_auditon == -1 && errno == ENOSYS) {
93*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for auditon(2) not available");
94*c54f35caSApple OSS Distributions 	}
95*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(rv_from_auditon, "auditon(2) A_GETSFLAGS succeeds");
96*c54f35caSApple OSS Distributions 	T_EXPECT_BITS_NOTSET(flags, ~(au_asflgs_t)VALID_AU_SESSION_FLAGS, NULL);
97*c54f35caSApple OSS Distributions 	T_EXPECT_BITS_SET(flags, (au_asflgs_t)AU_SESSION_FLAG_HAS_AUTHENTICATED, NULL);
98*c54f35caSApple OSS Distributions }
99*c54f35caSApple OSS Distributions 
100*c54f35caSApple OSS Distributions T_DECL(auditon_getpinfo_addr, "auditon(A_GETPINFO_ADDR) smoke test")
101*c54f35caSApple OSS Distributions {
102*c54f35caSApple OSS Distributions 	au_asid_t asid;
103*c54f35caSApple OSS Distributions 	au_id_t auid;
104*c54f35caSApple OSS Distributions 	get_asid_auid(&asid, &auid);
105*c54f35caSApple OSS Distributions 
106*c54f35caSApple OSS Distributions 	auditpinfo_addr_t apia = {};
107*c54f35caSApple OSS Distributions 	apia.ap_pid = getpid();
108*c54f35caSApple OSS Distributions 	int rv_from_auditon = auditon(A_GETPINFO_ADDR, &apia, sizeof(apia));
109*c54f35caSApple OSS Distributions 	if (rv_from_auditon == -1 && errno == ENOSYS) {
110*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for auditon(2) not available");
111*c54f35caSApple OSS Distributions 	}
112*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(rv_from_auditon, "auditon(2) A_GETPINFO_ADDR succeeds");
113*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_pid, getpid(), NULL);
114*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_asid, asid, NULL);
115*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_auid, auid, NULL);
116*c54f35caSApple OSS Distributions 	// any ap_mask
117*c54f35caSApple OSS Distributions 	// any ap_termid
118*c54f35caSApple OSS Distributions 	T_EXPECT_BITS_NOTSET(apia.ap_flags, ~(au_asflgs_t)VALID_AU_SESSION_FLAGS, NULL);
119*c54f35caSApple OSS Distributions 	T_EXPECT_BITS_SET(apia.ap_flags, (au_asflgs_t)AU_SESSION_FLAG_HAS_AUTHENTICATED, NULL);
120*c54f35caSApple OSS Distributions }
121*c54f35caSApple OSS Distributions 
122*c54f35caSApple OSS Distributions T_DECL(auditon_getsinfo_addr, "auditon(A_GETSINFO_ADDR) smoke test")
123*c54f35caSApple OSS Distributions {
124*c54f35caSApple OSS Distributions 	au_asid_t asid;
125*c54f35caSApple OSS Distributions 	au_id_t auid;
126*c54f35caSApple OSS Distributions 	get_asid_auid(&asid, &auid);
127*c54f35caSApple OSS Distributions 
128*c54f35caSApple OSS Distributions 	auditinfo_addr_t aia = {};
129*c54f35caSApple OSS Distributions 	aia.ai_asid = asid;
130*c54f35caSApple OSS Distributions 	int rv_from_auditon = auditon(A_GETSINFO_ADDR, &aia, sizeof(aia));
131*c54f35caSApple OSS Distributions 	if (rv_from_auditon == -1 && errno == ENOSYS) {
132*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for auditon(2) not available");
133*c54f35caSApple OSS Distributions 	}
134*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(rv_from_auditon, "auditon(2) A_GETSINFO_ADDR succeeds");
135*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_asid, asid, NULL);
136*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_auid, auid, NULL);
137*c54f35caSApple OSS Distributions 	// any ap_mask
138*c54f35caSApple OSS Distributions 	// any ap_termid
139*c54f35caSApple OSS Distributions 	T_EXPECT_BITS_NOTSET(aia.ai_flags, ~(au_asflgs_t)VALID_AU_SESSION_FLAGS, NULL);
140*c54f35caSApple OSS Distributions 	T_EXPECT_BITS_SET(aia.ai_flags, (au_asflgs_t)AU_SESSION_FLAG_HAS_AUTHENTICATED, NULL);
141*c54f35caSApple OSS Distributions }
142*c54f35caSApple OSS Distributions 
143*c54f35caSApple OSS Distributions T_DECL(auditon_getsinfo_addr_rootasid, "auditon(A_GETSINFO_ADDR) for root session")
144*c54f35caSApple OSS Distributions {
145*c54f35caSApple OSS Distributions 	// asid PID_MAX + 1 is the first session created after boot, which
146*c54f35caSApple OSS Distributions 	// is the root session.
147*c54f35caSApple OSS Distributions 	au_asid_t root_asid = PID_MAX + 1; // ASSIGNED_ASID_MIN
148*c54f35caSApple OSS Distributions 
149*c54f35caSApple OSS Distributions 	auditinfo_addr_t aia = {};
150*c54f35caSApple OSS Distributions 	aia.ai_asid = root_asid;
151*c54f35caSApple OSS Distributions 	int rv_from_auditon = auditon(A_GETSINFO_ADDR, &aia, sizeof(aia));
152*c54f35caSApple OSS Distributions 	if (rv_from_auditon == -1 && errno == ENOSYS) {
153*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for auditon(2) not available");
154*c54f35caSApple OSS Distributions 	}
155*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(rv_from_auditon, "auditon(2) A_GETSINFO_ADDR succeeds");
156*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_asid, root_asid, NULL);
157*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_auid, AU_DEFAUDITID, NULL);
158*c54f35caSApple OSS Distributions 	// any ap_mask
159*c54f35caSApple OSS Distributions 	// any ap_termid
160*c54f35caSApple OSS Distributions 	T_EXPECT_BITS_NOTSET(aia.ai_flags, ~(au_asflgs_t)VALID_AU_SESSION_FLAGS, NULL);
161*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_flags, (au_asflgs_t)AU_SESSION_FLAG_IS_INITIAL, NULL);
162*c54f35caSApple OSS Distributions }
163*c54f35caSApple OSS Distributions 
164*c54f35caSApple OSS Distributions T_DECL(auditon_getsinfo_addr_asid1, "auditon(A_GETSINFO_ADDR) for asid 1")
165*c54f35caSApple OSS Distributions {
166*c54f35caSApple OSS Distributions 	// asid 1 is in the pid range, and we don't expect launchd
167*c54f35caSApple OSS Distributions 	// to create a pid-based audit session for itself.
168*c54f35caSApple OSS Distributions 	auditinfo_addr_t aia = {};
169*c54f35caSApple OSS Distributions 	aia.ai_asid = 1;
170*c54f35caSApple OSS Distributions 	int rv_from_auditon = auditon(A_GETSINFO_ADDR, &aia, sizeof(aia));
171*c54f35caSApple OSS Distributions 	if (rv_from_auditon == -1 && errno == ENOSYS) {
172*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for auditon(2) not available");
173*c54f35caSApple OSS Distributions 	}
174*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_FAILURE(rv_from_auditon, EINVAL, "auditon(2) A_GETSINFO_ADDR fails");
175*c54f35caSApple OSS Distributions }
176*c54f35caSApple OSS Distributions 
177*c54f35caSApple OSS Distributions enum termid_mode {
178*c54f35caSApple OSS Distributions 	// Set terminal ID at session creation time.
179*c54f35caSApple OSS Distributions 	TERMIDM_NOUPDATE,
180*c54f35caSApple OSS Distributions 	// Create session w/o terminal ID, update later using setaudit_addr(2).
181*c54f35caSApple OSS Distributions 	TERMIDM_UPDATE_SETAUDIT_ADDR,
182*c54f35caSApple OSS Distributions };
183*c54f35caSApple OSS Distributions 
184*c54f35caSApple OSS Distributions enum auid_mode {
185*c54f35caSApple OSS Distributions 	// Set auid at session creation time.
186*c54f35caSApple OSS Distributions 	AUIDM_NOUPDATE,
187*c54f35caSApple OSS Distributions 	// Create session w/o auid, update later using setaudit_addr(2),
188*c54f35caSApple OSS Distributions 	// setting the auid and updating the flags.
189*c54f35caSApple OSS Distributions 	AUIDM_UPDATE_SETAUDIT_ADDR,
190*c54f35caSApple OSS Distributions 	// Create session w/o auid, update later using setauid(2) to set the
191*c54f35caSApple OSS Distributions 	// auid and auditon(2) A_SETSFLAGS to update the flags.
192*c54f35caSApple OSS Distributions 	AUIDM_UPDATE_SETAUID,
193*c54f35caSApple OSS Distributions };
194*c54f35caSApple OSS Distributions 
195*c54f35caSApple OSS Distributions // Covers many different ways to call setaudit_addr to create a
196*c54f35caSApple OSS Distributions // new session and typical patterns of updating the session.
197*c54f35caSApple OSS Distributions // Additionally, tests that forbidden updates to sessions are in
198*c54f35caSApple OSS Distributions // fact denied.
199*c54f35caSApple OSS Distributions static void
new_session_flow(au_asid_t asid,enum termid_mode termid_mode,uint32_t termid_type,enum auid_mode auid_mode)200*c54f35caSApple OSS Distributions new_session_flow(au_asid_t asid, enum termid_mode termid_mode, uint32_t termid_type, enum auid_mode auid_mode)
201*c54f35caSApple OSS Distributions {
202*c54f35caSApple OSS Distributions 	if (geteuid() != 0) {
203*c54f35caSApple OSS Distributions 		T_SKIP("This test should be run as super user.");
204*c54f35caSApple OSS Distributions 	}
205*c54f35caSApple OSS Distributions 
206*c54f35caSApple OSS Distributions 	static const au_id_t test_auid_a = 555;
207*c54f35caSApple OSS Distributions 	static const au_id_t test_auid_b = 556;
208*c54f35caSApple OSS Distributions 	static const dev_t test_port = 0xDEAD;
209*c54f35caSApple OSS Distributions 	static const u_int32_t test_addr_a = 0x00112233;
210*c54f35caSApple OSS Distributions 	static const u_int32_t test_addr_b = 0x44556677;
211*c54f35caSApple OSS Distributions 	static const u_int32_t test_addr_c = 0x8899AABB;
212*c54f35caSApple OSS Distributions 	static const u_int32_t test_addr_d = 0xCCDDEEFF;
213*c54f35caSApple OSS Distributions 	static const unsigned int test_tmp_mask_success = 0x00003001;
214*c54f35caSApple OSS Distributions 	static const unsigned int test_tmp_mask_failure = 0x00003002;
215*c54f35caSApple OSS Distributions 	static const unsigned int test_fin_mask_success = 0x00003003;
216*c54f35caSApple OSS Distributions 	static const unsigned int test_fin_mask_failure = 0x00003004;
217*c54f35caSApple OSS Distributions 
218*c54f35caSApple OSS Distributions 	// step 1: create new session
219*c54f35caSApple OSS Distributions 
220*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia1a = {}; // copy of what we pass into setaudit_addr
221*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia1b = {}; // passed into setaudit_addr, potentially modified
222*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia1c = {}; // obtained from getaudit_addr afterwards
223*c54f35caSApple OSS Distributions 
224*c54f35caSApple OSS Distributions 	aia1a.ai_asid = asid;
225*c54f35caSApple OSS Distributions 	if (auid_mode == AUIDM_NOUPDATE) {
226*c54f35caSApple OSS Distributions 		aia1a.ai_auid = test_auid_a;
227*c54f35caSApple OSS Distributions 		aia1a.ai_mask.am_success = test_fin_mask_success;
228*c54f35caSApple OSS Distributions 		aia1a.ai_mask.am_failure = test_fin_mask_failure;
229*c54f35caSApple OSS Distributions 	} else {
230*c54f35caSApple OSS Distributions 		// AU_DEFAUDITID allows updating the auid later
231*c54f35caSApple OSS Distributions 		aia1a.ai_auid = AU_DEFAUDITID;
232*c54f35caSApple OSS Distributions 		aia1a.ai_mask.am_success = test_tmp_mask_success;
233*c54f35caSApple OSS Distributions 		aia1a.ai_mask.am_failure = test_tmp_mask_failure;
234*c54f35caSApple OSS Distributions 	}
235*c54f35caSApple OSS Distributions 	if (termid_mode == TERMIDM_NOUPDATE) {
236*c54f35caSApple OSS Distributions 		aia1a.ai_termid.at_port = test_port;
237*c54f35caSApple OSS Distributions 		aia1a.ai_termid.at_type = termid_type;
238*c54f35caSApple OSS Distributions 		aia1a.ai_termid.at_addr[0] = test_addr_a;
239*c54f35caSApple OSS Distributions 		if (termid_type == AU_IPv6) {
240*c54f35caSApple OSS Distributions 			aia1a.ai_termid.at_addr[1] = test_addr_b;
241*c54f35caSApple OSS Distributions 			aia1a.ai_termid.at_addr[2] = test_addr_c;
242*c54f35caSApple OSS Distributions 			aia1a.ai_termid.at_addr[3] = test_addr_d;
243*c54f35caSApple OSS Distributions 		}
244*c54f35caSApple OSS Distributions 	} else {
245*c54f35caSApple OSS Distributions 		// at_type AU_IPv4 all other fields zero allows updating ai_termid later
246*c54f35caSApple OSS Distributions 		aia1a.ai_termid.at_type = AU_IPv4;
247*c54f35caSApple OSS Distributions 	}
248*c54f35caSApple OSS Distributions 	// For unknown reasons, AU_SESSION_FLAG_HAS_TTY cannot be set after session creation,
249*c54f35caSApple OSS Distributions 	// but the terminal ID can, which seems inconsistent.
250*c54f35caSApple OSS Distributions 	aia1a.ai_flags = AU_SESSION_FLAG_HAS_TTY | AU_SESSION_FLAG_IS_REMOTE;
251*c54f35caSApple OSS Distributions 	if (auid_mode == AUIDM_NOUPDATE) {
252*c54f35caSApple OSS Distributions 		aia1a.ai_flags |= AU_SESSION_FLAG_HAS_AUTHENTICATED;
253*c54f35caSApple OSS Distributions 	}
254*c54f35caSApple OSS Distributions 
255*c54f35caSApple OSS Distributions 	bcopy(&aia1a, &aia1b, sizeof(aia1b));
256*c54f35caSApple OSS Distributions 	int rv_from_setaudit_addr = setaudit_addr(&aia1b, sizeof(aia1b));
257*c54f35caSApple OSS Distributions 	if (rv_from_setaudit_addr == -1 && errno == ENOSYS) {
258*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for setaudit_addr(2) not available");
259*c54f35caSApple OSS Distributions 	}
260*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(rv_from_setaudit_addr, "setaudit_addr(2) succeeds at creating a new session");
261*c54f35caSApple OSS Distributions 	if (asid == AU_ASSIGN_ASID || asid == AU_DEFAUDITSID) {
262*c54f35caSApple OSS Distributions 		// Kernel choses free asid above pid range
263*c54f35caSApple OSS Distributions 		T_EXPECT_NE(aia1b.ai_asid, AU_ASSIGN_ASID, NULL);
264*c54f35caSApple OSS Distributions 		T_EXPECT_NE(aia1b.ai_asid, AU_DEFAUDITSID, NULL);
265*c54f35caSApple OSS Distributions 		T_EXPECT_GT(aia1b.ai_asid, PID_MAX, NULL);
266*c54f35caSApple OSS Distributions 	} else {
267*c54f35caSApple OSS Distributions 		// Kernel uses our asid suggestion
268*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia1b.ai_asid, aia1a.ai_asid, NULL);
269*c54f35caSApple OSS Distributions 	}
270*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1b.ai_auid, aia1a.ai_auid, NULL);
271*c54f35caSApple OSS Distributions #ifdef RDAR_104863182
272*c54f35caSApple OSS Distributions 	if (asid == AU_ASSIGN_ASID || asid == AU_DEFAUDITSID) {
273*c54f35caSApple OSS Distributions 		// New session was copied out because of AU_ASSIGN_ASID.
274*c54f35caSApple OSS Distributions 		// Masks on session have been zeroed at session creation,
275*c54f35caSApple OSS Distributions 		// and we got the masks from the session, not the cred.
276*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia1b.ai_mask.am_success, 0, NULL);
277*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia1b.ai_mask.am_failure, 0, NULL);
278*c54f35caSApple OSS Distributions 	} else {
279*c54f35caSApple OSS Distributions 		// The new session was not copied out.
280*c54f35caSApple OSS Distributions 		// Buffer still contains the masks we passed in.
281*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia1b.ai_mask.am_success, aia1a.ai_mask.am_success, NULL);
282*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia1b.ai_mask.am_failure, aia1a.ai_mask.am_failure, NULL);
283*c54f35caSApple OSS Distributions 	}
284*c54f35caSApple OSS Distributions #else // RDAR_104863182
285*c54f35caSApple OSS Distributions 	// A reasonable expectation would be that the mask is visible in a
286*c54f35caSApple OSS Distributions 	// symmetrical fashion to setaudit_addr(2) and getaudit_addr(2),
287*c54f35caSApple OSS Distributions 	// despite being per-process.  Otherwise the typical getaudit_addr(2)
288*c54f35caSApple OSS Distributions 	// then setaudit_addr(2) combo would not work as expected.
289*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1b.ai_mask.am_success, aia1a.ai_mask.am_success, NULL);
290*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1b.ai_mask.am_failure, aia1a.ai_mask.am_failure, NULL);
291*c54f35caSApple OSS Distributions #endif // RDAR_104863182
292*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1b.ai_termid.at_port, aia1a.ai_termid.at_port, NULL);
293*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1b.ai_termid.at_type, aia1a.ai_termid.at_type, NULL);
294*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1b.ai_termid.at_addr[0], aia1a.ai_termid.at_addr[0], NULL);
295*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1b.ai_termid.at_addr[1], aia1a.ai_termid.at_addr[1], NULL);
296*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1b.ai_termid.at_addr[2], aia1a.ai_termid.at_addr[2], NULL);
297*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1b.ai_termid.at_addr[3], aia1a.ai_termid.at_addr[3], NULL);
298*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1b.ai_flags, aia1a.ai_flags, NULL);
299*c54f35caSApple OSS Distributions 
300*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(getaudit_addr(&aia1c, sizeof(aia1c)), "getaudit_addr(2) succeeds at obtaining new session aia");
301*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_asid, aia1b.ai_asid, NULL);
302*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_auid, aia1b.ai_auid, NULL);
303*c54f35caSApple OSS Distributions #ifdef RDAR_104863182
304*c54f35caSApple OSS Distributions 	// Masks on session have been zeroed at session creation, and we got
305*c54f35caSApple OSS Distributions 	// the masks from the session back, not the cred.
306*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_mask.am_success, 0, NULL);
307*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_mask.am_failure, 0, NULL);
308*c54f35caSApple OSS Distributions #else // RDAR_104863182
309*c54f35caSApple OSS Distributions 	// Expect this to match what we passed into setaudit_addr(2), or what
310*c54f35caSApple OSS Distributions 	// setaudit_addr(2) copied out (see reasonable expectation above).
311*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_mask.am_success, aia1b.ai_mask.am_success, NULL);
312*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_mask.am_failure, aia1b.ai_mask.am_failure, NULL);
313*c54f35caSApple OSS Distributions #endif // RDAR_104863182
314*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_termid.at_port, aia1b.ai_termid.at_port, NULL);
315*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_termid.at_type, aia1b.ai_termid.at_type, NULL);
316*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_termid.at_addr[0], aia1b.ai_termid.at_addr[0], NULL);
317*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_termid.at_addr[1], aia1b.ai_termid.at_addr[1], NULL);
318*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_termid.at_addr[2], aia1b.ai_termid.at_addr[2], NULL);
319*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_termid.at_addr[3], aia1b.ai_termid.at_addr[3], NULL);
320*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia1c.ai_flags, aia1b.ai_flags, NULL);
321*c54f35caSApple OSS Distributions 
322*c54f35caSApple OSS Distributions 	au_asflgs_t flags1c = -1UL;
323*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(auditon(A_GETSFLAGS, &flags1c, sizeof(flags1c)), "auditon(2) A_GETSFLAGS succeeds");
324*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(flags1c, aia1c.ai_flags, NULL);
325*c54f35caSApple OSS Distributions 
326*c54f35caSApple OSS Distributions 	// step 2: depending on termid_mode, simulate accepting a network connection
327*c54f35caSApple OSS Distributions 
328*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia2a = {}; // copy of what we pass into setaudit_addr
329*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia2b = {}; // passed into setaudit_addr, potentially modified
330*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia2c = {}; // obtained from getaudit_addr afterwards
331*c54f35caSApple OSS Distributions 
332*c54f35caSApple OSS Distributions 	if (termid_mode != TERMIDM_NOUPDATE) {
333*c54f35caSApple OSS Distributions 		assert(termid_mode == TERMIDM_UPDATE_SETAUDIT_ADDR);
334*c54f35caSApple OSS Distributions 
335*c54f35caSApple OSS Distributions 		bcopy(&aia1c, &aia2a, sizeof(aia2a));
336*c54f35caSApple OSS Distributions 		aia2a.ai_termid.at_port = test_port;
337*c54f35caSApple OSS Distributions 		aia2a.ai_termid.at_type = termid_type;
338*c54f35caSApple OSS Distributions 		aia2a.ai_termid.at_addr[0] = test_addr_a;
339*c54f35caSApple OSS Distributions 		if (termid_type == AU_IPv6) {
340*c54f35caSApple OSS Distributions 			aia2a.ai_termid.at_addr[1] = test_addr_b;
341*c54f35caSApple OSS Distributions 			aia2a.ai_termid.at_addr[2] = test_addr_c;
342*c54f35caSApple OSS Distributions 			aia2a.ai_termid.at_addr[3] = test_addr_d;
343*c54f35caSApple OSS Distributions 		}
344*c54f35caSApple OSS Distributions #ifdef RDAR_104863182
345*c54f35caSApple OSS Distributions 		// aia1c contains the masks from the session that were zeroed at
346*c54f35caSApple OSS Distributions 		// session creation.  Updating the session with setaudit_addr(2)
347*c54f35caSApple OSS Distributions 		// will cause the masks to be updated on both the process cred
348*c54f35caSApple OSS Distributions 		// and the session aia itself.  To avoid losing the masks we
349*c54f35caSApple OSS Distributions 		// asked for at session creation, copy the masks we asked for.
350*c54f35caSApple OSS Distributions 		// We'd reset them to 0 otherwise.
351*c54f35caSApple OSS Distributions 		aia2a.ai_mask.am_success = aia1a.ai_mask.am_success;
352*c54f35caSApple OSS Distributions 		aia2a.ai_mask.am_failure = aia1a.ai_mask.am_failure;
353*c54f35caSApple OSS Distributions #endif // RDAR_104863182
354*c54f35caSApple OSS Distributions 
355*c54f35caSApple OSS Distributions 		bcopy(&aia2a, &aia2b, sizeof(aia2b));
356*c54f35caSApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(setaudit_addr(&aia2b, sizeof(aia2b)), "setaudit_addr(2) succeeds at updating the session with a terminal ID");
357*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2b.ai_asid, aia2a.ai_asid, NULL);
358*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2b.ai_auid, aia2a.ai_auid, NULL);
359*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2b.ai_mask.am_success, aia2a.ai_mask.am_success, NULL);
360*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2b.ai_mask.am_failure, aia2a.ai_mask.am_failure, NULL);
361*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2b.ai_termid.at_port, aia2a.ai_termid.at_port, NULL);
362*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2b.ai_termid.at_type, aia2a.ai_termid.at_type, NULL);
363*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2b.ai_termid.at_addr[0], aia2a.ai_termid.at_addr[0], NULL);
364*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2b.ai_termid.at_addr[1], aia2a.ai_termid.at_addr[1], NULL);
365*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2b.ai_termid.at_addr[2], aia2a.ai_termid.at_addr[2], NULL);
366*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2b.ai_termid.at_addr[3], aia2a.ai_termid.at_addr[3], NULL);
367*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2b.ai_flags, aia2a.ai_flags, NULL);
368*c54f35caSApple OSS Distributions 
369*c54f35caSApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(getaudit_addr(&aia2c, sizeof(aia2c)), "getaudit_addr(2) succeeds at obtaining updated session aia");
370*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2c.ai_asid, aia2b.ai_asid, NULL);
371*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2c.ai_auid, aia2b.ai_auid, NULL);
372*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2c.ai_mask.am_success, aia2b.ai_mask.am_success, NULL);
373*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2c.ai_mask.am_failure, aia2b.ai_mask.am_failure, NULL);
374*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2c.ai_termid.at_port, aia2b.ai_termid.at_port, NULL);
375*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2c.ai_termid.at_type, aia2b.ai_termid.at_type, NULL);
376*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2c.ai_termid.at_addr[0], aia2b.ai_termid.at_addr[0], NULL);
377*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2c.ai_termid.at_addr[1], aia2b.ai_termid.at_addr[1], NULL);
378*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2c.ai_termid.at_addr[2], aia2b.ai_termid.at_addr[2], NULL);
379*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2c.ai_termid.at_addr[3], aia2b.ai_termid.at_addr[3], NULL);
380*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia2c.ai_flags, aia2b.ai_flags, NULL);
381*c54f35caSApple OSS Distributions 	} else {
382*c54f35caSApple OSS Distributions 		assert(termid_mode == TERMIDM_NOUPDATE);
383*c54f35caSApple OSS Distributions 
384*c54f35caSApple OSS Distributions 		bcopy(&aia1c, &aia2c, sizeof(aia2c));
385*c54f35caSApple OSS Distributions 	}
386*c54f35caSApple OSS Distributions 
387*c54f35caSApple OSS Distributions 	// step 3: depending on auid_mode, simulate authenticating the session
388*c54f35caSApple OSS Distributions 
389*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia3a = {}; // copy of what we pass into setaudit_addr
390*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia3b = {}; // passed into setaudit_addr, potentially modified
391*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia3c = {}; // obtained from getaudit_addr afterwards
392*c54f35caSApple OSS Distributions 
393*c54f35caSApple OSS Distributions 	if (auid_mode != AUIDM_NOUPDATE) {
394*c54f35caSApple OSS Distributions 		if (auid_mode == AUIDM_UPDATE_SETAUDIT_ADDR) {
395*c54f35caSApple OSS Distributions 			bcopy(&aia2c, &aia3a, sizeof(aia3a));
396*c54f35caSApple OSS Distributions 			aia3a.ai_auid = test_auid_a;
397*c54f35caSApple OSS Distributions 			aia3a.ai_flags |= AU_SESSION_FLAG_HAS_AUTHENTICATED;
398*c54f35caSApple OSS Distributions 			// Set new masks now that we know the user and would have looked
399*c54f35caSApple OSS Distributions 			// up the users masks using au_user_mask(3).
400*c54f35caSApple OSS Distributions 			aia3a.ai_mask.am_success = test_fin_mask_success;
401*c54f35caSApple OSS Distributions 			aia3a.ai_mask.am_failure = test_fin_mask_failure;
402*c54f35caSApple OSS Distributions 
403*c54f35caSApple OSS Distributions 			bcopy(&aia3a, &aia3b, sizeof(aia3b));
404*c54f35caSApple OSS Distributions 			T_ASSERT_POSIX_SUCCESS(setaudit_addr(&aia3b, sizeof(aia3b)), "setaudit_addr(2) succeeds at updating the session as authenticated");
405*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(aia3b.ai_asid, aia3a.ai_asid, NULL);
406*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(aia3b.ai_auid, aia3a.ai_auid, NULL);
407*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(aia3b.ai_mask.am_success, aia3a.ai_mask.am_success, NULL);
408*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(aia3b.ai_mask.am_failure, aia3a.ai_mask.am_failure, NULL);
409*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(aia3b.ai_termid.at_port, aia3a.ai_termid.at_port, NULL);
410*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(aia3b.ai_termid.at_type, aia3a.ai_termid.at_type, NULL);
411*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(aia3b.ai_termid.at_addr[0], aia3a.ai_termid.at_addr[0], NULL);
412*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(aia3b.ai_termid.at_addr[1], aia3a.ai_termid.at_addr[1], NULL);
413*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(aia3b.ai_termid.at_addr[2], aia3a.ai_termid.at_addr[2], NULL);
414*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(aia3b.ai_termid.at_addr[3], aia3a.ai_termid.at_addr[3], NULL);
415*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(aia3b.ai_flags, aia3a.ai_flags, NULL);
416*c54f35caSApple OSS Distributions 		} else {
417*c54f35caSApple OSS Distributions 			assert(auid_mode == AUIDM_UPDATE_SETAUID);
418*c54f35caSApple OSS Distributions 
419*c54f35caSApple OSS Distributions 			auditpinfo_t api = {};
420*c54f35caSApple OSS Distributions 			api.ap_pid = getpid();
421*c54f35caSApple OSS Distributions 			api.ap_mask.am_success = test_fin_mask_success;
422*c54f35caSApple OSS Distributions 			api.ap_mask.am_failure = test_fin_mask_failure;
423*c54f35caSApple OSS Distributions 			T_ASSERT_POSIX_SUCCESS(auditon(A_SETPMASK, &api, sizeof(api)), "auditon(2) A_SETPMASK succeeds");
424*c54f35caSApple OSS Distributions 
425*c54f35caSApple OSS Distributions 			struct auditinfo_addr new_aia = {};
426*c54f35caSApple OSS Distributions 			T_ASSERT_POSIX_SUCCESS(getaudit_addr(&new_aia, sizeof(new_aia)), "getaudit_addr(2) after auditon(2) A_SETPMASK succeeds");
427*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_asid, aia2c.ai_asid, NULL);
428*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_auid, aia2c.ai_auid, NULL);
429*c54f35caSApple OSS Distributions #ifdef RDAR_104863182
430*c54f35caSApple OSS Distributions 			// auditon(A_SETPMASK) sets the new masks only on process credential,
431*c54f35caSApple OSS Distributions 			// because audit_session_setaia() only copies the aia to the session
432*c54f35caSApple OSS Distributions 			// when fields other than only the masks have changed.
433*c54f35caSApple OSS Distributions 			// The call to setauid(2) below will propagate the masks from the
434*c54f35caSApple OSS Distributions 			// process credential to the audit session, from where it will be
435*c54f35caSApple OSS Distributions 			// visible to getaudit_addr(2).
436*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_mask.am_success, aia2c.ai_mask.am_success, NULL);
437*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_mask.am_failure, aia2c.ai_mask.am_failure, NULL);
438*c54f35caSApple OSS Distributions #else
439*c54f35caSApple OSS Distributions 			// Expect the per-process mask to be visible to getaudit_addr(2).
440*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_mask.am_success, test_fin_mask_success, NULL);
441*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_mask.am_failure, test_fin_mask_failure, NULL);
442*c54f35caSApple OSS Distributions #endif
443*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_port, aia2c.ai_termid.at_port, NULL);
444*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_type, aia2c.ai_termid.at_type, NULL);
445*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_addr[0], aia2c.ai_termid.at_addr[0], NULL);
446*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_addr[1], aia2c.ai_termid.at_addr[1], NULL);
447*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_addr[2], aia2c.ai_termid.at_addr[2], NULL);
448*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_addr[3], aia2c.ai_termid.at_addr[3], NULL);
449*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_flags, aia2c.ai_flags, NULL);
450*c54f35caSApple OSS Distributions 
451*c54f35caSApple OSS Distributions 			au_id_t new_auid = test_auid_a;
452*c54f35caSApple OSS Distributions 			T_ASSERT_POSIX_SUCCESS(setauid(&new_auid), "setauid(2) succeeds at updating the auid of the session");
453*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_auid, test_auid_a, NULL);
454*c54f35caSApple OSS Distributions 
455*c54f35caSApple OSS Distributions 			T_ASSERT_POSIX_SUCCESS(getaudit_addr(&new_aia, sizeof(new_aia)), "getaudit_addr(2) after setauid(2) succeeds");
456*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_asid, aia2c.ai_asid, NULL);
457*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_auid, new_auid, NULL);
458*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_mask.am_success, test_fin_mask_success, NULL);
459*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_mask.am_failure, test_fin_mask_failure, NULL);
460*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_port, aia2c.ai_termid.at_port, NULL);
461*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_type, aia2c.ai_termid.at_type, NULL);
462*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_addr[0], aia2c.ai_termid.at_addr[0], NULL);
463*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_addr[1], aia2c.ai_termid.at_addr[1], NULL);
464*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_addr[2], aia2c.ai_termid.at_addr[2], NULL);
465*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_termid.at_addr[3], aia2c.ai_termid.at_addr[3], NULL);
466*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_aia.ai_flags, aia2c.ai_flags, NULL);
467*c54f35caSApple OSS Distributions 
468*c54f35caSApple OSS Distributions 			// propagates masks from audit session to process credential
469*c54f35caSApple OSS Distributions 			au_asflgs_t new_flags = -1UL;
470*c54f35caSApple OSS Distributions 			T_ASSERT_POSIX_SUCCESS(auditon(A_GETSFLAGS, &new_flags, sizeof(new_flags)), "auditon(2) A_GETSFLAGS succeeds");
471*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_flags, flags1c, NULL);
472*c54f35caSApple OSS Distributions 			new_flags |= AU_SESSION_FLAG_HAS_AUTHENTICATED;
473*c54f35caSApple OSS Distributions 			T_ASSERT_POSIX_SUCCESS(auditon(A_SETSFLAGS, &new_flags, sizeof(new_flags)), "auditon(2) A_SETSFLAGS succeeds");
474*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_flags, flags1c | AU_SESSION_FLAG_HAS_AUTHENTICATED, NULL);
475*c54f35caSApple OSS Distributions 			new_flags = -1UL;
476*c54f35caSApple OSS Distributions 			T_ASSERT_POSIX_SUCCESS(auditon(A_GETSFLAGS, &new_flags, sizeof(new_flags)), "auditon(2) A_GETSFLAGS succeeds");
477*c54f35caSApple OSS Distributions 			T_EXPECT_EQ(new_flags, flags1c | AU_SESSION_FLAG_HAS_AUTHENTICATED, NULL);
478*c54f35caSApple OSS Distributions 
479*c54f35caSApple OSS Distributions 			bcopy(&aia2c, &aia3b, sizeof(aia3b));
480*c54f35caSApple OSS Distributions 			aia3b.ai_auid = new_auid;
481*c54f35caSApple OSS Distributions 			aia3b.ai_flags |= AU_SESSION_FLAG_HAS_AUTHENTICATED;
482*c54f35caSApple OSS Distributions 			aia3b.ai_mask.am_success = test_fin_mask_success;
483*c54f35caSApple OSS Distributions 			aia3b.ai_mask.am_failure = test_fin_mask_failure;
484*c54f35caSApple OSS Distributions 		}
485*c54f35caSApple OSS Distributions 
486*c54f35caSApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(getaudit_addr(&aia3c, sizeof(aia3c)), "getaudit_addr(2) succeeds at obtaining updated session aia");
487*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia3c.ai_asid, aia3b.ai_asid, NULL);
488*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia3c.ai_auid, aia3b.ai_auid, NULL);
489*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia3c.ai_mask.am_success, aia3b.ai_mask.am_success, NULL);
490*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia3c.ai_mask.am_failure, aia3b.ai_mask.am_failure, NULL);
491*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia3c.ai_termid.at_port, aia3b.ai_termid.at_port, NULL);
492*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia3c.ai_termid.at_type, aia3b.ai_termid.at_type, NULL);
493*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia3c.ai_termid.at_addr[0], aia3b.ai_termid.at_addr[0], NULL);
494*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia3c.ai_termid.at_addr[1], aia3b.ai_termid.at_addr[1], NULL);
495*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia3c.ai_termid.at_addr[2], aia3b.ai_termid.at_addr[2], NULL);
496*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia3c.ai_termid.at_addr[3], aia3b.ai_termid.at_addr[3], NULL);
497*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia3c.ai_flags, aia3b.ai_flags, NULL);
498*c54f35caSApple OSS Distributions 	} else {
499*c54f35caSApple OSS Distributions 		assert(auid_mode == AUIDM_NOUPDATE);
500*c54f35caSApple OSS Distributions 
501*c54f35caSApple OSS Distributions 		bcopy(&aia2c, &aia3c, sizeof(aia3c));
502*c54f35caSApple OSS Distributions 	}
503*c54f35caSApple OSS Distributions 
504*c54f35caSApple OSS Distributions 	// At this point, the session is fully set up.
505*c54f35caSApple OSS Distributions 
506*c54f35caSApple OSS Distributions 	// Changing the auid after it has been set is forbidden.
507*c54f35caSApple OSS Distributions 
508*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia4a = {};
509*c54f35caSApple OSS Distributions 	bcopy(&aia3c, &aia4a, sizeof(aia4a));
510*c54f35caSApple OSS Distributions 	aia4a.ai_auid = test_auid_b;
511*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia4b = {};
512*c54f35caSApple OSS Distributions 	bcopy(&aia4a, &aia4b, sizeof(aia4b));
513*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_FAILURE(setaudit_addr(&aia4b, sizeof(aia4b)), EINVAL, "setaudit_addr(2) refuses changing auid once set");
514*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia4b.ai_asid, aia4a.ai_asid, NULL);
515*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia4b.ai_auid, aia4a.ai_auid, NULL);
516*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia4b.ai_mask.am_success, aia4a.ai_mask.am_success, NULL);
517*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia4b.ai_mask.am_failure, aia4a.ai_mask.am_failure, NULL);
518*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia4b.ai_termid.at_port, aia4a.ai_termid.at_port, NULL);
519*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia4b.ai_termid.at_type, aia4a.ai_termid.at_type, NULL);
520*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia4b.ai_termid.at_addr[0], aia4a.ai_termid.at_addr[0], NULL);
521*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia4b.ai_termid.at_addr[1], aia4a.ai_termid.at_addr[1], NULL);
522*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia4b.ai_termid.at_addr[2], aia4a.ai_termid.at_addr[2], NULL);
523*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia4b.ai_termid.at_addr[3], aia4a.ai_termid.at_addr[3], NULL);
524*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia4b.ai_flags, aia4a.ai_flags, NULL);
525*c54f35caSApple OSS Distributions 
526*c54f35caSApple OSS Distributions 	au_id_t new_auid = test_auid_b;
527*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_FAILURE(setauid(&new_auid), EINVAL, "setauid(2) refuses changing auid once set");
528*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(new_auid, test_auid_b, NULL);
529*c54f35caSApple OSS Distributions 
530*c54f35caSApple OSS Distributions 	// Changing the terminal ID after it has been set is forbidden.
531*c54f35caSApple OSS Distributions 
532*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia5a = {};
533*c54f35caSApple OSS Distributions 	bcopy(&aia3c, &aia5a, sizeof(aia5a));
534*c54f35caSApple OSS Distributions 	aia5a.ai_termid.at_port = ~aia5a.ai_termid.at_port;
535*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia5b = {};
536*c54f35caSApple OSS Distributions 	bcopy(&aia5a, &aia5b, sizeof(aia5b));
537*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_FAILURE(setaudit_addr(&aia5b, sizeof(aia5b)), EINVAL, "setaudit_addr(2) refuses changing termid port once set");
538*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia5b.ai_asid, aia5a.ai_asid, NULL);
539*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia5b.ai_auid, aia5a.ai_auid, NULL);
540*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia5b.ai_mask.am_success, aia5a.ai_mask.am_success, NULL);
541*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia5b.ai_mask.am_failure, aia5a.ai_mask.am_failure, NULL);
542*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia5b.ai_termid.at_port, aia5a.ai_termid.at_port, NULL);
543*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia5b.ai_termid.at_type, aia5a.ai_termid.at_type, NULL);
544*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia5b.ai_termid.at_addr[0], aia5a.ai_termid.at_addr[0], NULL);
545*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia5b.ai_termid.at_addr[1], aia5a.ai_termid.at_addr[1], NULL);
546*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia5b.ai_termid.at_addr[2], aia5a.ai_termid.at_addr[2], NULL);
547*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia5b.ai_termid.at_addr[3], aia5a.ai_termid.at_addr[3], NULL);
548*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia5b.ai_flags, aia5a.ai_flags, NULL);
549*c54f35caSApple OSS Distributions 
550*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia6a = {};
551*c54f35caSApple OSS Distributions 	bcopy(&aia3c, &aia6a, sizeof(aia6a));
552*c54f35caSApple OSS Distributions 	aia6a.ai_termid.at_type = aia6a.ai_termid.at_type == AU_IPv4 ? AU_IPv6 : AU_IPv4;
553*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia6b = {};
554*c54f35caSApple OSS Distributions 	bcopy(&aia6a, &aia6b, sizeof(aia6b));
555*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_FAILURE(setaudit_addr(&aia6b, sizeof(aia6b)), EINVAL, "setaudit_addr(2) refuses changing termid type once set");
556*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia6b.ai_asid, aia6a.ai_asid, NULL);
557*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia6b.ai_auid, aia6a.ai_auid, NULL);
558*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia6b.ai_mask.am_success, aia6a.ai_mask.am_success, NULL);
559*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia6b.ai_mask.am_failure, aia6a.ai_mask.am_failure, NULL);
560*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia6b.ai_termid.at_port, aia6a.ai_termid.at_port, NULL);
561*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia6b.ai_termid.at_type, aia6a.ai_termid.at_type, NULL);
562*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia6b.ai_termid.at_addr[0], aia6a.ai_termid.at_addr[0], NULL);
563*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia6b.ai_termid.at_addr[1], aia6a.ai_termid.at_addr[1], NULL);
564*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia6b.ai_termid.at_addr[2], aia6a.ai_termid.at_addr[2], NULL);
565*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia6b.ai_termid.at_addr[3], aia6a.ai_termid.at_addr[3], NULL);
566*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia6b.ai_flags, aia6a.ai_flags, NULL);
567*c54f35caSApple OSS Distributions 
568*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia7a = {};
569*c54f35caSApple OSS Distributions 	bcopy(&aia3c, &aia7a, sizeof(aia7a));
570*c54f35caSApple OSS Distributions 	aia7a.ai_termid.at_addr[0] = ~aia7a.ai_termid.at_addr[0];
571*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia7b = {};
572*c54f35caSApple OSS Distributions 	bcopy(&aia7a, &aia7b, sizeof(aia7b));
573*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_FAILURE(setaudit_addr(&aia7b, sizeof(aia7b)), EINVAL, "setaudit_addr(2) refuses changing termid addr once set");
574*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia7b.ai_asid, aia7a.ai_asid, NULL);
575*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia7b.ai_auid, aia7a.ai_auid, NULL);
576*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia7b.ai_mask.am_success, aia7a.ai_mask.am_success, NULL);
577*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia7b.ai_mask.am_failure, aia7a.ai_mask.am_failure, NULL);
578*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia7b.ai_termid.at_port, aia7a.ai_termid.at_port, NULL);
579*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia7b.ai_termid.at_type, aia7a.ai_termid.at_type, NULL);
580*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia7b.ai_termid.at_addr[0], aia7a.ai_termid.at_addr[0], NULL);
581*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia7b.ai_termid.at_addr[1], aia7a.ai_termid.at_addr[1], NULL);
582*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia7b.ai_termid.at_addr[2], aia7a.ai_termid.at_addr[2], NULL);
583*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia7b.ai_termid.at_addr[3], aia7a.ai_termid.at_addr[3], NULL);
584*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia7b.ai_flags, aia7a.ai_flags, NULL);
585*c54f35caSApple OSS Distributions 
586*c54f35caSApple OSS Distributions 	// Removing protected flags is forbidden.
587*c54f35caSApple OSS Distributions 
588*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia8a = {};
589*c54f35caSApple OSS Distributions 	bcopy(&aia3c, &aia8a, sizeof(aia8a));
590*c54f35caSApple OSS Distributions 	aia8a.ai_flags &= ~(au_asflgs_t)AU_SESSION_FLAG_IS_REMOTE;
591*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia8b = {};
592*c54f35caSApple OSS Distributions 	bcopy(&aia8a, &aia8b, sizeof(aia8b));
593*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_FAILURE(setaudit_addr(&aia8b, sizeof(aia8b)), EINVAL, "setaudit_addr(2) refuses changing protected flags once set");
594*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia8b.ai_asid, aia8a.ai_asid, NULL);
595*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia8b.ai_auid, aia8a.ai_auid, NULL);
596*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia8b.ai_mask.am_success, aia8a.ai_mask.am_success, NULL);
597*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia8b.ai_mask.am_failure, aia8a.ai_mask.am_failure, NULL);
598*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia8b.ai_termid.at_port, aia8a.ai_termid.at_port, NULL);
599*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia8b.ai_termid.at_type, aia8a.ai_termid.at_type, NULL);
600*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia8b.ai_termid.at_addr[0], aia8a.ai_termid.at_addr[0], NULL);
601*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia8b.ai_termid.at_addr[1], aia8a.ai_termid.at_addr[1], NULL);
602*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia8b.ai_termid.at_addr[2], aia8a.ai_termid.at_addr[2], NULL);
603*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia8b.ai_termid.at_addr[3], aia8a.ai_termid.at_addr[3], NULL);
604*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia8b.ai_flags, aia8a.ai_flags, NULL);
605*c54f35caSApple OSS Distributions 
606*c54f35caSApple OSS Distributions 	au_asflgs_t new_flags = -1UL;
607*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(auditon(A_GETSFLAGS, &new_flags, sizeof(new_flags)), "auditon(2) A_GETSFLAGS succeeds");
608*c54f35caSApple OSS Distributions 	T_EXPECT_BITS_SET(new_flags, AU_SESSION_FLAG_IS_REMOTE, NULL);
609*c54f35caSApple OSS Distributions 	new_flags &= ~(au_asflgs_t)AU_SESSION_FLAG_IS_REMOTE;
610*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_FAILURE(auditon(A_SETSFLAGS, &new_flags, sizeof(new_flags)), EINVAL, "auditon(2) A_SETSFLAGS refuses changing protected flags once set");
611*c54f35caSApple OSS Distributions 	T_EXPECT_BITS_NOTSET(new_flags, AU_SESSION_FLAG_IS_REMOTE, NULL);
612*c54f35caSApple OSS Distributions 
613*c54f35caSApple OSS Distributions 	// auditon(2) A_GETPINFO retrieves the session by pid, IPv4 only.
614*c54f35caSApple OSS Distributions 
615*c54f35caSApple OSS Distributions 	auditpinfo_t api = {};
616*c54f35caSApple OSS Distributions 	api.ap_pid = getpid();
617*c54f35caSApple OSS Distributions 	if (termid_type == AU_IPv4) {
618*c54f35caSApple OSS Distributions 		T_ASSERT_POSIX_SUCCESS(auditon(A_GETPINFO, &api, sizeof(api)), "auditon(2) A_GETPINFO succeeds for IPv4 terminal ID");
619*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(api.ap_pid, getpid(), NULL);
620*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(api.ap_asid, aia3c.ai_asid, NULL);
621*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(api.ap_auid, aia3c.ai_auid, NULL);
622*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(api.ap_mask.am_success, test_fin_mask_success, NULL);
623*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(api.ap_mask.am_failure, test_fin_mask_failure, NULL);
624*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(api.ap_termid.port, aia3c.ai_termid.at_port, NULL);
625*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(api.ap_termid.machine, aia3c.ai_termid.at_addr[0], NULL);
626*c54f35caSApple OSS Distributions 	} else {
627*c54f35caSApple OSS Distributions 		T_ASSERT_POSIX_FAILURE(auditon(A_GETPINFO, &api, sizeof(api)), EINVAL, "auditon(2) A_GETPINFO fails for IPv6 terminal ID");
628*c54f35caSApple OSS Distributions 	}
629*c54f35caSApple OSS Distributions 
630*c54f35caSApple OSS Distributions 	// auditon(2) A_GETPINFO_ADDR retrieves the session by pid.
631*c54f35caSApple OSS Distributions 
632*c54f35caSApple OSS Distributions 	auditpinfo_addr_t apia = {};
633*c54f35caSApple OSS Distributions 	apia.ap_pid = getpid();
634*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(auditon(A_GETPINFO_ADDR, &apia, sizeof(apia)), "auditon(2) A_GETPINFO_ADDR succeeds");
635*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_pid, getpid(), NULL);
636*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_asid, aia3c.ai_asid, NULL);
637*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_auid, aia3c.ai_auid, NULL);
638*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_mask.am_success, test_fin_mask_success, NULL);
639*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_mask.am_failure, test_fin_mask_failure, NULL);
640*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_termid.at_port, aia3c.ai_termid.at_port, NULL);
641*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_termid.at_type, aia3c.ai_termid.at_type, NULL);
642*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_termid.at_addr[0], aia3c.ai_termid.at_addr[0], NULL);
643*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_termid.at_addr[1], aia3c.ai_termid.at_addr[1], NULL);
644*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_termid.at_addr[2], aia3c.ai_termid.at_addr[2], NULL);
645*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_termid.at_addr[3], aia3c.ai_termid.at_addr[3], NULL);
646*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(apia.ap_flags, aia3c.ai_flags, NULL);
647*c54f35caSApple OSS Distributions 
648*c54f35caSApple OSS Distributions 	// auditon(2) A_GETSINFO_ADDR retrieves the session by asid.
649*c54f35caSApple OSS Distributions 
650*c54f35caSApple OSS Distributions 	auditinfo_addr_t aia9 = {};
651*c54f35caSApple OSS Distributions 	aia9.ai_asid = aia3c.ai_asid;
652*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(auditon(A_GETSINFO_ADDR, &aia9, sizeof(aia9)), "auditon(2) A_GETSINFO_ADDR succeeds");
653*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia9.ai_asid, aia3c.ai_asid, NULL);
654*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia9.ai_auid, aia3c.ai_auid, NULL);
655*c54f35caSApple OSS Distributions #ifdef RDAR_104863182
656*c54f35caSApple OSS Distributions 	if (termid_mode == TERMIDM_NOUPDATE && auid_mode == AUIDM_NOUPDATE) {
657*c54f35caSApple OSS Distributions 		// Session still has the initial 0 masks from session creation
658*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia9.ai_mask.am_success, 0, NULL);
659*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia9.ai_mask.am_failure, 0, NULL);
660*c54f35caSApple OSS Distributions 	} else {
661*c54f35caSApple OSS Distributions 		// Session masks got overwritten by a session update
662*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia9.ai_mask.am_success, test_fin_mask_success, NULL);
663*c54f35caSApple OSS Distributions 		T_EXPECT_EQ(aia9.ai_mask.am_failure, test_fin_mask_failure, NULL);
664*c54f35caSApple OSS Distributions 	}
665*c54f35caSApple OSS Distributions #else // RDAR_104863182
666*c54f35caSApple OSS Distributions 	// Session masks should still be zero unless clobbered by audit session Mach port creation
667*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia9.ai_mask.am_success, 0, NULL);
668*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia9.ai_mask.am_failure, 0, NULL);
669*c54f35caSApple OSS Distributions #endif // RDAR_104863182
670*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia9.ai_termid.at_port, aia3c.ai_termid.at_port, NULL);
671*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia9.ai_termid.at_type, aia3c.ai_termid.at_type, NULL);
672*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia9.ai_termid.at_addr[0], aia3c.ai_termid.at_addr[0], NULL);
673*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia9.ai_termid.at_addr[1], aia3c.ai_termid.at_addr[1], NULL);
674*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia9.ai_termid.at_addr[2], aia3c.ai_termid.at_addr[2], NULL);
675*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia9.ai_termid.at_addr[3], aia3c.ai_termid.at_addr[3], NULL);
676*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia9.ai_flags, aia3c.ai_flags, NULL);
677*c54f35caSApple OSS Distributions }
678*c54f35caSApple OSS Distributions 
679*c54f35caSApple OSS Distributions // Test all combinations of:
680*c54f35caSApple OSS Distributions // asid = { AU_ASSIGN_ASID | AU_DEFAUDITSID | getpid() }
681*c54f35caSApple OSS Distributions // termid_mode = { TERMIDM_NOUPDATE | TERMIDM_UPDATE_SETAUDIT_ADDR }
682*c54f35caSApple OSS Distributions // termid_type = { AU_IPv4 | AU_IPv6 }
683*c54f35caSApple OSS Distributions // auid_mode = { AUIDM_NOUPDATE | AUIDM_UPDATE_SETAUDIT_ADDR | AUIDM_UPDATE_SETAUID }
684*c54f35caSApple OSS Distributions 
685*c54f35caSApple OSS Distributions T_DECL(new_session_1141, "new session asid=AU_ASSIGN_ASID termid=noupdate IPv4 auid=noupdate")
686*c54f35caSApple OSS Distributions {
687*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_NOUPDATE, AU_IPv4, AUIDM_NOUPDATE);
688*c54f35caSApple OSS Distributions }
689*c54f35caSApple OSS Distributions 
690*c54f35caSApple OSS Distributions T_DECL(new_session_1142, "new session asid=AU_ASSIGN_ASID termid=noupdate IPv4 auid=setaudit_addr")
691*c54f35caSApple OSS Distributions {
692*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_NOUPDATE, AU_IPv4, AUIDM_UPDATE_SETAUDIT_ADDR);
693*c54f35caSApple OSS Distributions }
694*c54f35caSApple OSS Distributions 
695*c54f35caSApple OSS Distributions T_DECL(new_session_1143, "new session asid=AU_ASSIGN_ASID termid=noupdate IPv4 auid=setauid")
696*c54f35caSApple OSS Distributions {
697*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_NOUPDATE, AU_IPv4, AUIDM_UPDATE_SETAUID);
698*c54f35caSApple OSS Distributions }
699*c54f35caSApple OSS Distributions 
700*c54f35caSApple OSS Distributions T_DECL(new_session_1161, "new session asid=AU_ASSIGN_ASID termid=noupdate IPv6 auid=noupdate")
701*c54f35caSApple OSS Distributions {
702*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_NOUPDATE, AU_IPv6, AUIDM_NOUPDATE);
703*c54f35caSApple OSS Distributions }
704*c54f35caSApple OSS Distributions 
705*c54f35caSApple OSS Distributions T_DECL(new_session_1162, "new session asid=AU_ASSIGN_ASID termid=noupdate IPv6 auid=setaudit_addr")
706*c54f35caSApple OSS Distributions {
707*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_NOUPDATE, AU_IPv6, AUIDM_UPDATE_SETAUDIT_ADDR);
708*c54f35caSApple OSS Distributions }
709*c54f35caSApple OSS Distributions 
710*c54f35caSApple OSS Distributions T_DECL(new_session_1163, "new session asid=AU_ASSIGN_ASID termid=noupdate IPv6 auid=setauid")
711*c54f35caSApple OSS Distributions {
712*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_NOUPDATE, AU_IPv6, AUIDM_UPDATE_SETAUID);
713*c54f35caSApple OSS Distributions }
714*c54f35caSApple OSS Distributions 
715*c54f35caSApple OSS Distributions T_DECL(new_session_1241, "new session asid=AU_ASSIGN_ASID termid=setaudit_addr IPv4 auid=noupdate")
716*c54f35caSApple OSS Distributions {
717*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv4, AUIDM_NOUPDATE);
718*c54f35caSApple OSS Distributions }
719*c54f35caSApple OSS Distributions 
720*c54f35caSApple OSS Distributions T_DECL(new_session_1242, "new session asid=AU_ASSIGN_ASID termid=setaudit_addr IPv4 auid=setaudit_addr")
721*c54f35caSApple OSS Distributions {
722*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv4, AUIDM_UPDATE_SETAUDIT_ADDR);
723*c54f35caSApple OSS Distributions }
724*c54f35caSApple OSS Distributions 
725*c54f35caSApple OSS Distributions T_DECL(new_session_1243, "new session asid=AU_ASSIGN_ASID termid=setaudit_addr IPv4 auid=setauid")
726*c54f35caSApple OSS Distributions {
727*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv4, AUIDM_UPDATE_SETAUID);
728*c54f35caSApple OSS Distributions }
729*c54f35caSApple OSS Distributions 
730*c54f35caSApple OSS Distributions T_DECL(new_session_1261, "new session asid=AU_ASSIGN_ASID termid=setaudit_addr IPv6 auid=noupdate")
731*c54f35caSApple OSS Distributions {
732*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_NOUPDATE);
733*c54f35caSApple OSS Distributions }
734*c54f35caSApple OSS Distributions 
735*c54f35caSApple OSS Distributions T_DECL(new_session_1262, "new session asid=AU_ASSIGN_ASID termid=setaudit_addr IPv6 auid=setaudit_addr")
736*c54f35caSApple OSS Distributions {
737*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_UPDATE_SETAUDIT_ADDR);
738*c54f35caSApple OSS Distributions }
739*c54f35caSApple OSS Distributions 
740*c54f35caSApple OSS Distributions T_DECL(new_session_1263, "new session asid=AU_ASSIGN_ASID termid=setaudit_addr IPv6 auid=setauid")
741*c54f35caSApple OSS Distributions {
742*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_UPDATE_SETAUID);
743*c54f35caSApple OSS Distributions }
744*c54f35caSApple OSS Distributions 
745*c54f35caSApple OSS Distributions T_DECL(new_session_2141, "new session asid=AU_DEFAUDITSID termid=noupdate IPv4 auid=noupdate")
746*c54f35caSApple OSS Distributions {
747*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_NOUPDATE, AU_IPv4, AUIDM_NOUPDATE);
748*c54f35caSApple OSS Distributions }
749*c54f35caSApple OSS Distributions 
750*c54f35caSApple OSS Distributions T_DECL(new_session_2142, "new session asid=AU_DEFAUDITSID termid=noupdate IPv4 auid=setaudit_addr")
751*c54f35caSApple OSS Distributions {
752*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_NOUPDATE, AU_IPv4, AUIDM_UPDATE_SETAUDIT_ADDR);
753*c54f35caSApple OSS Distributions }
754*c54f35caSApple OSS Distributions 
755*c54f35caSApple OSS Distributions T_DECL(new_session_2143, "new session asid=AU_DEFAUDITSID termid=noupdate IPv4 auid=setauid")
756*c54f35caSApple OSS Distributions {
757*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_NOUPDATE, AU_IPv4, AUIDM_UPDATE_SETAUID);
758*c54f35caSApple OSS Distributions }
759*c54f35caSApple OSS Distributions 
760*c54f35caSApple OSS Distributions T_DECL(new_session_2161, "new session asid=AU_DEFAUDITSID termid=noupdate IPv6 auid=noupdate")
761*c54f35caSApple OSS Distributions {
762*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_NOUPDATE, AU_IPv6, AUIDM_NOUPDATE);
763*c54f35caSApple OSS Distributions }
764*c54f35caSApple OSS Distributions 
765*c54f35caSApple OSS Distributions T_DECL(new_session_2162, "new session asid=AU_DEFAUDITSID termid=noupdate IPv6 auid=setaudit_addr")
766*c54f35caSApple OSS Distributions {
767*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_NOUPDATE, AU_IPv6, AUIDM_UPDATE_SETAUDIT_ADDR);
768*c54f35caSApple OSS Distributions }
769*c54f35caSApple OSS Distributions 
770*c54f35caSApple OSS Distributions T_DECL(new_session_2163, "new session asid=AU_DEFAUDITSID termid=noupdate IPv6 auid=setauid")
771*c54f35caSApple OSS Distributions {
772*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_NOUPDATE, AU_IPv6, AUIDM_UPDATE_SETAUID);
773*c54f35caSApple OSS Distributions }
774*c54f35caSApple OSS Distributions 
775*c54f35caSApple OSS Distributions T_DECL(new_session_2241, "new session asid=AU_DEFAUDITSID termid=setaudit_addr IPv4 auid=noupdate")
776*c54f35caSApple OSS Distributions {
777*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv4, AUIDM_NOUPDATE);
778*c54f35caSApple OSS Distributions }
779*c54f35caSApple OSS Distributions 
780*c54f35caSApple OSS Distributions T_DECL(new_session_2242, "new session asid=AU_DEFAUDITSID termid=setaudit_addr IPv4 auid=setaudit_addr")
781*c54f35caSApple OSS Distributions {
782*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv4, AUIDM_UPDATE_SETAUDIT_ADDR);
783*c54f35caSApple OSS Distributions }
784*c54f35caSApple OSS Distributions 
785*c54f35caSApple OSS Distributions T_DECL(new_session_2243, "new session asid=AU_DEFAUDITSID termid=setaudit_addr IPv4 auid=setauid")
786*c54f35caSApple OSS Distributions {
787*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv4, AUIDM_UPDATE_SETAUID);
788*c54f35caSApple OSS Distributions }
789*c54f35caSApple OSS Distributions 
790*c54f35caSApple OSS Distributions T_DECL(new_session_2261, "new session asid=AU_DEFAUDITSID termid=setaudit_addr IPv6 auid=noupdate")
791*c54f35caSApple OSS Distributions {
792*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_NOUPDATE);
793*c54f35caSApple OSS Distributions }
794*c54f35caSApple OSS Distributions 
795*c54f35caSApple OSS Distributions T_DECL(new_session_2262, "new session asid=AU_DEFAUDITSID termid=setaudit_addr IPv6 auid=setaudit_addr")
796*c54f35caSApple OSS Distributions {
797*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_UPDATE_SETAUDIT_ADDR);
798*c54f35caSApple OSS Distributions }
799*c54f35caSApple OSS Distributions 
800*c54f35caSApple OSS Distributions T_DECL(new_session_2263, "new session asid=AU_DEFAUDITSID termid=setaudit_addr IPv6 auid=setauid")
801*c54f35caSApple OSS Distributions {
802*c54f35caSApple OSS Distributions 	new_session_flow(AU_DEFAUDITSID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_UPDATE_SETAUID);
803*c54f35caSApple OSS Distributions }
804*c54f35caSApple OSS Distributions 
805*c54f35caSApple OSS Distributions T_DECL(new_session_3141, "new session asid=getpid() termid=noupdate IPv4 auid=noupdate")
806*c54f35caSApple OSS Distributions {
807*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_NOUPDATE, AU_IPv4, AUIDM_NOUPDATE);
808*c54f35caSApple OSS Distributions }
809*c54f35caSApple OSS Distributions 
810*c54f35caSApple OSS Distributions T_DECL(new_session_3142, "new session asid=getpid() termid=noupdate IPv4 auid=setaudit_addr")
811*c54f35caSApple OSS Distributions {
812*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_NOUPDATE, AU_IPv4, AUIDM_UPDATE_SETAUDIT_ADDR);
813*c54f35caSApple OSS Distributions }
814*c54f35caSApple OSS Distributions 
815*c54f35caSApple OSS Distributions T_DECL(new_session_3143, "new session asid=getpid() termid=noupdate IPv4 auid=setauid")
816*c54f35caSApple OSS Distributions {
817*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_NOUPDATE, AU_IPv4, AUIDM_UPDATE_SETAUID);
818*c54f35caSApple OSS Distributions }
819*c54f35caSApple OSS Distributions 
820*c54f35caSApple OSS Distributions T_DECL(new_session_3161, "new session asid=getpid() termid=noupdate IPv6 auid=noupdate")
821*c54f35caSApple OSS Distributions {
822*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_NOUPDATE, AU_IPv6, AUIDM_NOUPDATE);
823*c54f35caSApple OSS Distributions }
824*c54f35caSApple OSS Distributions 
825*c54f35caSApple OSS Distributions T_DECL(new_session_3162, "new session asid=getpid() termid=noupdate IPv6 auid=setaudit_addr")
826*c54f35caSApple OSS Distributions {
827*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_NOUPDATE, AU_IPv6, AUIDM_UPDATE_SETAUDIT_ADDR);
828*c54f35caSApple OSS Distributions }
829*c54f35caSApple OSS Distributions 
830*c54f35caSApple OSS Distributions T_DECL(new_session_3163, "new session asid=getpid() termid=noupdate IPv6 auid=setauid")
831*c54f35caSApple OSS Distributions {
832*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_NOUPDATE, AU_IPv6, AUIDM_UPDATE_SETAUID);
833*c54f35caSApple OSS Distributions }
834*c54f35caSApple OSS Distributions 
835*c54f35caSApple OSS Distributions T_DECL(new_session_3241, "new session asid=getpid() termid=setaudit_addr IPv4 auid=noupdate")
836*c54f35caSApple OSS Distributions {
837*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv4, AUIDM_NOUPDATE);
838*c54f35caSApple OSS Distributions }
839*c54f35caSApple OSS Distributions 
840*c54f35caSApple OSS Distributions T_DECL(new_session_3242, "new session asid=getpid() termid=setaudit_addr IPv4 auid=setaudit_addr")
841*c54f35caSApple OSS Distributions {
842*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv4, AUIDM_UPDATE_SETAUDIT_ADDR);
843*c54f35caSApple OSS Distributions }
844*c54f35caSApple OSS Distributions 
845*c54f35caSApple OSS Distributions T_DECL(new_session_3243, "new session asid=getpid() termid=setaudit_addr IPv4 auid=setauid")
846*c54f35caSApple OSS Distributions {
847*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv4, AUIDM_UPDATE_SETAUID);
848*c54f35caSApple OSS Distributions }
849*c54f35caSApple OSS Distributions 
850*c54f35caSApple OSS Distributions T_DECL(new_session_3261, "new session asid=getpid() termid=setaudit_addr IPv6 auid=noupdate")
851*c54f35caSApple OSS Distributions {
852*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_NOUPDATE);
853*c54f35caSApple OSS Distributions }
854*c54f35caSApple OSS Distributions 
855*c54f35caSApple OSS Distributions T_DECL(new_session_3262, "new session asid=getpid() termid=setaudit_addr IPv6 auid=setaudit_addr")
856*c54f35caSApple OSS Distributions {
857*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_UPDATE_SETAUDIT_ADDR);
858*c54f35caSApple OSS Distributions }
859*c54f35caSApple OSS Distributions 
860*c54f35caSApple OSS Distributions T_DECL(new_session_3263, "new session asid=getpid() termid=setaudit_addr IPv6 auid=setauid")
861*c54f35caSApple OSS Distributions {
862*c54f35caSApple OSS Distributions 	new_session_flow(getpid(), TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_UPDATE_SETAUID);
863*c54f35caSApple OSS Distributions }
864*c54f35caSApple OSS Distributions 
865*c54f35caSApple OSS Distributions #define NEW_SESSION_CHECK_CHILD_FILENAME "new_session_check_child_aia"
866*c54f35caSApple OSS Distributions 
867*c54f35caSApple OSS Distributions T_HELPER_DECL(check_child_session, "Check child aia against file")
868*c54f35caSApple OSS Distributions {
869*c54f35caSApple OSS Distributions 	char path[MAXPATHLEN];
870*c54f35caSApple OSS Distributions 	snprintf(path, MAXPATHLEN, "%s/" NEW_SESSION_CHECK_CHILD_FILENAME, dt_tmpdir());
871*c54f35caSApple OSS Distributions 	int fd = open(path, O_RDONLY);
872*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(fd, "open %s by pid %d for reading", path, getpid());
873*c54f35caSApple OSS Distributions 	struct auditinfo_addr expected_aia;
874*c54f35caSApple OSS Distributions 	ssize_t bytes_read = read(fd, &expected_aia, sizeof(expected_aia));
875*c54f35caSApple OSS Distributions 	T_ASSERT_EQ(bytes_read, (ssize_t)sizeof(expected_aia), NULL);
876*c54f35caSApple OSS Distributions 	close(fd);
877*c54f35caSApple OSS Distributions 
878*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia;
879*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(getaudit_addr(&aia, sizeof(aia)), "getaudit_addr(2) succeeds");
880*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_asid, expected_aia.ai_asid, NULL);
881*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_auid, expected_aia.ai_auid, NULL);
882*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_mask.am_success, expected_aia.ai_mask.am_success, NULL);
883*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_mask.am_failure, expected_aia.ai_mask.am_failure, NULL);
884*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_termid.at_port, expected_aia.ai_termid.at_port, NULL);
885*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_termid.at_type, expected_aia.ai_termid.at_type, NULL);
886*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_termid.at_addr[0], expected_aia.ai_termid.at_addr[0], NULL);
887*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_termid.at_addr[1], expected_aia.ai_termid.at_addr[1], NULL);
888*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_termid.at_addr[2], expected_aia.ai_termid.at_addr[2], NULL);
889*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_termid.at_addr[3], expected_aia.ai_termid.at_addr[3], NULL);
890*c54f35caSApple OSS Distributions 	T_EXPECT_EQ(aia.ai_flags, expected_aia.ai_flags, NULL);
891*c54f35caSApple OSS Distributions 
892*c54f35caSApple OSS Distributions 	T_END;
893*c54f35caSApple OSS Distributions }
894*c54f35caSApple OSS Distributions 
895*c54f35caSApple OSS Distributions T_DECL(new_session_check_child_aia, "new session is inherited by child processes")
896*c54f35caSApple OSS Distributions {
897*c54f35caSApple OSS Distributions 	int cond, rv_from_auditon = auditon(A_GETCOND, &cond, sizeof(cond));
898*c54f35caSApple OSS Distributions 	if (rv_from_auditon == -1 && errno == ENOSYS) {
899*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for auditon(2) not available");
900*c54f35caSApple OSS Distributions 	}
901*c54f35caSApple OSS Distributions 
902*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_UPDATE_SETAUDIT_ADDR);
903*c54f35caSApple OSS Distributions 
904*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia;
905*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(getaudit_addr(&aia, sizeof(aia)), "getaudit_addr(2) succeeds");
906*c54f35caSApple OSS Distributions 
907*c54f35caSApple OSS Distributions 	char path[MAXPATHLEN];
908*c54f35caSApple OSS Distributions 	snprintf(path, MAXPATHLEN, "%s/" NEW_SESSION_CHECK_CHILD_FILENAME, dt_tmpdir());
909*c54f35caSApple OSS Distributions 	int fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0755);
910*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(fd, "open %s by pid %d for writing", path, getpid());
911*c54f35caSApple OSS Distributions 	ssize_t bytes_written = write(fd, &aia, sizeof(aia));
912*c54f35caSApple OSS Distributions 	T_ASSERT_EQ(bytes_written, (ssize_t)sizeof(aia), NULL);
913*c54f35caSApple OSS Distributions 	close(fd);
914*c54f35caSApple OSS Distributions 
915*c54f35caSApple OSS Distributions 	dt_helper_t helper = dt_child_helper("check_child_session");
916*c54f35caSApple OSS Distributions 	dt_run_helpers(&helper, 1, 30 /* timeout */);
917*c54f35caSApple OSS Distributions }
918*c54f35caSApple OSS Distributions 
919*c54f35caSApple OSS Distributions #undef NEW_SESSION_CHECK_CHILD_FILENAME
920*c54f35caSApple OSS Distributions 
921*c54f35caSApple OSS Distributions #define NEW_SESSION_CLEANUP_FILENAME "new_session_cleanup_aia"
922*c54f35caSApple OSS Distributions 
923*c54f35caSApple OSS Distributions T_HELPER_DECL(child_create_session, "Create a session in a child process")
924*c54f35caSApple OSS Distributions {
925*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_UPDATE_SETAUDIT_ADDR);
926*c54f35caSApple OSS Distributions 
927*c54f35caSApple OSS Distributions 	struct auditinfo_addr aia;
928*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(getaudit_addr(&aia, sizeof(aia)), "getaudit_addr(2) succeeds");
929*c54f35caSApple OSS Distributions 
930*c54f35caSApple OSS Distributions 	char tmppath[MAXPATHLEN];
931*c54f35caSApple OSS Distributions 	snprintf(tmppath, MAXPATHLEN, "%s/" NEW_SESSION_CLEANUP_FILENAME "~", dt_tmpdir());
932*c54f35caSApple OSS Distributions 	int fd = open(tmppath, O_CREAT | O_TRUNC | O_RDWR, 0755);
933*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(fd, "open %s by pid %d for writing", tmppath, getpid());
934*c54f35caSApple OSS Distributions 	ssize_t bytes_written = write(fd, &aia, sizeof(aia));
935*c54f35caSApple OSS Distributions 	T_ASSERT_EQ(bytes_written, (ssize_t)sizeof(aia), NULL);
936*c54f35caSApple OSS Distributions 	pid_t pid = getpid();
937*c54f35caSApple OSS Distributions 	bytes_written = write(fd, &pid, sizeof(pid));
938*c54f35caSApple OSS Distributions 	T_ASSERT_EQ(bytes_written, (ssize_t)sizeof(pid), NULL);
939*c54f35caSApple OSS Distributions 	close(fd);
940*c54f35caSApple OSS Distributions 
941*c54f35caSApple OSS Distributions 	// Atomically move it into place so that we can reliably for it over in the other helper.
942*c54f35caSApple OSS Distributions 	char path[MAXPATHLEN];
943*c54f35caSApple OSS Distributions 	snprintf(path, MAXPATHLEN, "%s/" NEW_SESSION_CLEANUP_FILENAME, dt_tmpdir());
944*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(rename(tmppath, path), "move %s to %s by pid %d", tmppath, path, getpid());
945*c54f35caSApple OSS Distributions 
946*c54f35caSApple OSS Distributions 	T_END;
947*c54f35caSApple OSS Distributions }
948*c54f35caSApple OSS Distributions 
949*c54f35caSApple OSS Distributions T_HELPER_DECL(child_session_disappeared, "Check that session created in other helper disappeared")
950*c54f35caSApple OSS Distributions {
951*c54f35caSApple OSS Distributions 	static const size_t max_attempts = 10;
952*c54f35caSApple OSS Distributions 	static const useconds_t delay_us = 250000;
953*c54f35caSApple OSS Distributions 
954*c54f35caSApple OSS Distributions 	char path[MAXPATHLEN];
955*c54f35caSApple OSS Distributions 	snprintf(path, MAXPATHLEN, "%s/" NEW_SESSION_CLEANUP_FILENAME, dt_tmpdir());
956*c54f35caSApple OSS Distributions 
957*c54f35caSApple OSS Distributions 	// Wait for the file written by the other helper.
958*c54f35caSApple OSS Distributions 	int fd = -1;
959*c54f35caSApple OSS Distributions 	for (size_t attempt = 0; fd == -1 && attempt < max_attempts; attempt++) {
960*c54f35caSApple OSS Distributions 		if (attempt > 0) {
961*c54f35caSApple OSS Distributions 			usleep(delay_us * (useconds_t)attempt);
962*c54f35caSApple OSS Distributions 		}
963*c54f35caSApple OSS Distributions 		fd = open(path, O_RDONLY);
964*c54f35caSApple OSS Distributions 	}
965*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(fd, "open %s by pid %d for reading", path, getpid());
966*c54f35caSApple OSS Distributions 	struct auditinfo_addr other_child_aia;
967*c54f35caSApple OSS Distributions 	ssize_t bytes_read = read(fd, &other_child_aia, sizeof(other_child_aia));
968*c54f35caSApple OSS Distributions 	T_ASSERT_EQ(bytes_read, (ssize_t)sizeof(other_child_aia), NULL);
969*c54f35caSApple OSS Distributions 	pid_t other_child_pid;
970*c54f35caSApple OSS Distributions 	bytes_read = read(fd, &other_child_pid, sizeof(other_child_pid));
971*c54f35caSApple OSS Distributions 	T_ASSERT_EQ(bytes_read, (ssize_t)sizeof(other_child_pid), NULL);
972*c54f35caSApple OSS Distributions 	close(fd);
973*c54f35caSApple OSS Distributions 
974*c54f35caSApple OSS Distributions 	// Wait for the other helper to have exited.
975*c54f35caSApple OSS Distributions 	int rv = 0;
976*c54f35caSApple OSS Distributions 	for (size_t attempt = 0; rv == 0 && attempt < max_attempts; attempt++) {
977*c54f35caSApple OSS Distributions 		if (attempt > 0) {
978*c54f35caSApple OSS Distributions 			usleep(delay_us * (useconds_t)attempt);
979*c54f35caSApple OSS Distributions 		}
980*c54f35caSApple OSS Distributions 		rv = kill(other_child_pid, 0);
981*c54f35caSApple OSS Distributions 	}
982*c54f35caSApple OSS Distributions 
983*c54f35caSApple OSS Distributions 	// The session should now have disappeared.
984*c54f35caSApple OSS Distributions 	auditinfo_addr_t aia = {};
985*c54f35caSApple OSS Distributions 	aia.ai_asid = other_child_aia.ai_asid;
986*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_FAILURE(auditon(A_GETSINFO_ADDR, &aia, sizeof(aia)), EINVAL, "auditon(2) A_GETSINFO_ADDR cannot find the session");
987*c54f35caSApple OSS Distributions 
988*c54f35caSApple OSS Distributions 	T_END;
989*c54f35caSApple OSS Distributions }
990*c54f35caSApple OSS Distributions 
991*c54f35caSApple OSS Distributions T_DECL(new_session_cleanup, "new session disappears on process exit")
992*c54f35caSApple OSS Distributions {
993*c54f35caSApple OSS Distributions 	int cond, rv_from_auditon = auditon(A_GETCOND, &cond, sizeof(cond));
994*c54f35caSApple OSS Distributions 	if (rv_from_auditon == -1 && errno == ENOSYS) {
995*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for auditon(2) not available");
996*c54f35caSApple OSS Distributions 	}
997*c54f35caSApple OSS Distributions 
998*c54f35caSApple OSS Distributions 	char path[MAXPATHLEN];
999*c54f35caSApple OSS Distributions 	snprintf(path, MAXPATHLEN, "%s/" NEW_SESSION_CLEANUP_FILENAME, dt_tmpdir());
1000*c54f35caSApple OSS Distributions 	(void)unlink(path);
1001*c54f35caSApple OSS Distributions 
1002*c54f35caSApple OSS Distributions 	dt_helper_t helpers[2];
1003*c54f35caSApple OSS Distributions 	helpers[0] = dt_child_helper("child_create_session");
1004*c54f35caSApple OSS Distributions 	helpers[1] = dt_child_helper("child_session_disappeared");
1005*c54f35caSApple OSS Distributions 	dt_run_helpers(helpers, 2, 30 /* timeout */);
1006*c54f35caSApple OSS Distributions }
1007*c54f35caSApple OSS Distributions 
1008*c54f35caSApple OSS Distributions #undef NEW_SESSION_CLEANUP_FILENAME
1009*c54f35caSApple OSS Distributions 
1010*c54f35caSApple OSS Distributions T_DECL(audit_session_self, "audit_session_self(2) smoke test")
1011*c54f35caSApple OSS Distributions {
1012*c54f35caSApple OSS Distributions 	int cond, rv_from_auditon = auditon(A_GETCOND, &cond, sizeof(cond));
1013*c54f35caSApple OSS Distributions 	if (rv_from_auditon == -1 && errno == ENOSYS) {
1014*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for auditon(2) not available");
1015*c54f35caSApple OSS Distributions 	}
1016*c54f35caSApple OSS Distributions 
1017*c54f35caSApple OSS Distributions 	mach_port_t session_port = audit_session_self();
1018*c54f35caSApple OSS Distributions 	T_ASSERT_TRUE(MACH_PORT_VALID(session_port), "audit_session_self(2) returns valid send right");
1019*c54f35caSApple OSS Distributions }
1020*c54f35caSApple OSS Distributions 
1021*c54f35caSApple OSS Distributions T_DECL(audit_session_port_join, "audit_session_port(2) and audit_session_join(2) smoke test")
1022*c54f35caSApple OSS Distributions {
1023*c54f35caSApple OSS Distributions 	int cond, rv_from_auditon = auditon(A_GETCOND, &cond, sizeof(cond));
1024*c54f35caSApple OSS Distributions 	if (rv_from_auditon == -1 && errno == ENOSYS) {
1025*c54f35caSApple OSS Distributions 		T_SKIP("Kernel support for auditon(2) not available");
1026*c54f35caSApple OSS Distributions 	}
1027*c54f35caSApple OSS Distributions 
1028*c54f35caSApple OSS Distributions 	au_asid_t original_asid;
1029*c54f35caSApple OSS Distributions 	au_id_t original_auid;
1030*c54f35caSApple OSS Distributions 	get_asid_auid(&original_asid, &original_auid);
1031*c54f35caSApple OSS Distributions 
1032*c54f35caSApple OSS Distributions 	// Change into newly created session
1033*c54f35caSApple OSS Distributions 	new_session_flow(AU_ASSIGN_ASID, TERMIDM_UPDATE_SETAUDIT_ADDR, AU_IPv6, AUIDM_UPDATE_SETAUDIT_ADDR);
1034*c54f35caSApple OSS Distributions 
1035*c54f35caSApple OSS Distributions 	// Assert we're in a new session
1036*c54f35caSApple OSS Distributions 	au_asid_t new_asid;
1037*c54f35caSApple OSS Distributions 	au_id_t new_auid;
1038*c54f35caSApple OSS Distributions 	get_asid_auid(&new_asid, &new_auid);
1039*c54f35caSApple OSS Distributions 	T_ASSERT_NE(new_asid, original_asid, NULL);
1040*c54f35caSApple OSS Distributions 	T_ASSERT_NE(new_auid, original_auid, NULL);
1041*c54f35caSApple OSS Distributions 
1042*c54f35caSApple OSS Distributions 	// Obtain session port for original session
1043*c54f35caSApple OSS Distributions 	mach_port_t session_port;
1044*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(audit_session_port(original_asid, &session_port), "audit_session_port(2) succeeds");
1045*c54f35caSApple OSS Distributions 	T_ASSERT_TRUE(MACH_PORT_VALID(session_port), NULL);
1046*c54f35caSApple OSS Distributions 
1047*c54f35caSApple OSS Distributions 	// Join original session
1048*c54f35caSApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(audit_session_join(session_port), "audit_session_join(2) succeeds");
1049*c54f35caSApple OSS Distributions 
1050*c54f35caSApple OSS Distributions 	// Assert we're back in the original session
1051*c54f35caSApple OSS Distributions 	get_asid_auid(&new_asid, &new_auid);
1052*c54f35caSApple OSS Distributions 	T_ASSERT_EQ(new_asid, original_asid, NULL);
1053*c54f35caSApple OSS Distributions 	T_ASSERT_EQ(new_auid, original_auid, NULL);
1054*c54f35caSApple OSS Distributions }
1055