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