xref: /xnu-11417.140.69/tests/rm/pthread_setugid.c (revision 43a90889846e00bfb5cf1d255cdc0a701a1e05a4)
1*43a90889SApple OSS Distributions #include <darwintest.h>
2*43a90889SApple OSS Distributions #include <darwintest_utils.h>
3*43a90889SApple OSS Distributions #include <dispatch/dispatch.h>
4*43a90889SApple OSS Distributions #include <sys/kauth.h>
5*43a90889SApple OSS Distributions #include <sys/param.h>
6*43a90889SApple OSS Distributions #include <sys/unistd.h>
7*43a90889SApple OSS Distributions 
8*43a90889SApple OSS Distributions T_GLOBAL_META(T_META_NAMESPACE("xnu.rm"),
9*43a90889SApple OSS Distributions     T_META_RADAR_COMPONENT_NAME("xnu"),
10*43a90889SApple OSS Distributions     T_META_RADAR_COMPONENT_VERSION("rm"),
11*43a90889SApple OSS Distributions     T_META_OWNER("phabouzit")
12*43a90889SApple OSS Distributions     );
13*43a90889SApple OSS Distributions 
14*43a90889SApple OSS Distributions T_DECL(pthread_setugid_np_81523076,
15*43a90889SApple OSS Distributions     "Make sure pthread_setugid_np() isn't sticky to workqueue threads",
16*43a90889SApple OSS Distributions     T_META_CHECK_LEAKS(false),
17*43a90889SApple OSS Distributions     T_META_ASROOT(true),
18*43a90889SApple OSS Distributions     T_META_TAG_VM_PREFERRED)
19*43a90889SApple OSS Distributions {
20*43a90889SApple OSS Distributions 	int rc;
21*43a90889SApple OSS Distributions 
22*43a90889SApple OSS Distributions 	rc = pthread_setugid_np(501, getgid());
23*43a90889SApple OSS Distributions 	T_ASSERT_POSIX_SUCCESS(rc, "pthread_setugid_np(501, getgid())");
24*43a90889SApple OSS Distributions 
25*43a90889SApple OSS Distributions 	dispatch_async(dispatch_get_global_queue(0, 0), ^{
26*43a90889SApple OSS Distributions 		T_ASSERT_EQ(getuid(), 0, "getuid should still be 0");
27*43a90889SApple OSS Distributions 		T_END;
28*43a90889SApple OSS Distributions 	});
29*43a90889SApple OSS Distributions 	pause();
30*43a90889SApple OSS Distributions }
31*43a90889SApple OSS Distributions 
32*43a90889SApple OSS Distributions T_DECL(pthread_setugid_np_124671138,
33*43a90889SApple OSS Distributions     "Make sure pthread_setugid_np() isn't sticky to workqueue threads",
34*43a90889SApple OSS Distributions     T_META_CHECK_LEAKS(false),
35*43a90889SApple OSS Distributions     T_META_ASROOT(true),
36*43a90889SApple OSS Distributions     T_META_ENABLED(false), /* this test takes 10+minutes on some HW */
37*43a90889SApple OSS Distributions     T_META_TAG_VM_PREFERRED)
38*43a90889SApple OSS Distributions {
39*43a90889SApple OSS Distributions 	size_t batch = 1024;
40*43a90889SApple OSS Distributions 	size_t count = roundup(0x0FFFFFFFUL + 10, batch);
41*43a90889SApple OSS Distributions 
42*43a90889SApple OSS Distributions 	if (dt_ncpu() < 10) {
43*43a90889SApple OSS Distributions 		T_SKIP("too slow of a test");
44*43a90889SApple OSS Distributions 	}
45*43a90889SApple OSS Distributions 
46*43a90889SApple OSS Distributions 	dispatch_apply(count / batch, DISPATCH_APPLY_AUTO, ^(size_t n) {
47*43a90889SApple OSS Distributions 		int rc;
48*43a90889SApple OSS Distributions 
49*43a90889SApple OSS Distributions 		for (int i = 0; i < batch; i++) {
50*43a90889SApple OSS Distributions 		        rc = pthread_setugid_np(501, 501);
51*43a90889SApple OSS Distributions 		        assert(rc == 0);
52*43a90889SApple OSS Distributions 		        rc = pthread_setugid_np(KAUTH_UID_NONE, KAUTH_UID_NONE);
53*43a90889SApple OSS Distributions 		        assert(rc == 0);
54*43a90889SApple OSS Distributions 		}
55*43a90889SApple OSS Distributions 		if ((n * batch) % (1024 * batch) == 0) {
56*43a90889SApple OSS Distributions 		        T_LOG("%.2f\n", n * batch * 100. / count);
57*43a90889SApple OSS Distributions 		}
58*43a90889SApple OSS Distributions 	});
59*43a90889SApple OSS Distributions 
60*43a90889SApple OSS Distributions 	T_PASS("the kernel shouldn't panic due to a leak");
61*43a90889SApple OSS Distributions }
62