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