xref: /xnu-8792.81.2/tests/settimeofday_29193041_entitled.c (revision 19c3b8c28c31cb8130e034cfb5df6bf9ba342d90)
1*19c3b8c2SApple OSS Distributions #include <stdio.h>
2*19c3b8c2SApple OSS Distributions #include <errno.h>
3*19c3b8c2SApple OSS Distributions #include <string.h>
4*19c3b8c2SApple OSS Distributions #include <unistd.h>
5*19c3b8c2SApple OSS Distributions #include <sys/mman.h>
6*19c3b8c2SApple OSS Distributions #include <mach/clock_types.h>
7*19c3b8c2SApple OSS Distributions #include <sys/timex.h>
8*19c3b8c2SApple OSS Distributions #include <spawn.h>
9*19c3b8c2SApple OSS Distributions #include <darwintest.h>
10*19c3b8c2SApple OSS Distributions #include <darwintest_utils.h>
11*19c3b8c2SApple OSS Distributions 
12*19c3b8c2SApple OSS Distributions /*
13*19c3b8c2SApple OSS Distributions  * This test expects the entitlement or root privileges for a process to
14*19c3b8c2SApple OSS Distributions  * set the time using settimeofday syscall.
15*19c3b8c2SApple OSS Distributions  */
16*19c3b8c2SApple OSS Distributions 
17*19c3b8c2SApple OSS Distributions #define DAY 86400 //1 day in sec
18*19c3b8c2SApple OSS Distributions 
19*19c3b8c2SApple OSS Distributions T_DECL(settime_32089962_entitled_root,
20*19c3b8c2SApple OSS Distributions     "Verify that root privileges can allow to change the time",
21*19c3b8c2SApple OSS Distributions     T_META_ASROOT(true), T_META_CHECK_LEAKS(false))
22*19c3b8c2SApple OSS Distributions {
23*19c3b8c2SApple OSS Distributions 	struct timeval settimeofdaytime;
24*19c3b8c2SApple OSS Distributions 	struct timeval adj_time;
25*19c3b8c2SApple OSS Distributions 	struct timex ntptime;
26*19c3b8c2SApple OSS Distributions 
27*19c3b8c2SApple OSS Distributions 	if (geteuid() != 0) {
28*19c3b8c2SApple OSS Distributions 		T_SKIP("settime_32089962_entitled_root test requires root privileges to run.");
29*19c3b8c2SApple OSS Distributions 	}
30*19c3b8c2SApple OSS Distributions 
31*19c3b8c2SApple OSS Distributions 	/* test settimeofday */
32*19c3b8c2SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_ZERO(gettimeofday(&settimeofdaytime, NULL), NULL);
33*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_ZERO(settimeofday(&settimeofdaytime, NULL), NULL);
34*19c3b8c2SApple OSS Distributions 
35*19c3b8c2SApple OSS Distributions 	/* test adjtime */
36*19c3b8c2SApple OSS Distributions 	adj_time.tv_sec = 1;
37*19c3b8c2SApple OSS Distributions 	adj_time.tv_usec = 0;
38*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_ZERO(adjtime(&adj_time, NULL), NULL);
39*19c3b8c2SApple OSS Distributions 
40*19c3b8c2SApple OSS Distributions 	/* test ntp_adjtime */
41*19c3b8c2SApple OSS Distributions 	memset(&ntptime, 0, sizeof(ntptime));
42*19c3b8c2SApple OSS Distributions 	ntptime.modes |= MOD_STATUS;
43*19c3b8c2SApple OSS Distributions 	ntptime.status = TIME_OK;
44*19c3b8c2SApple OSS Distributions 
45*19c3b8c2SApple OSS Distributions 	T_ASSERT_EQ(ntp_adjtime(&ntptime), TIME_OK, NULL);
46*19c3b8c2SApple OSS Distributions }
47*19c3b8c2SApple OSS Distributions 
48*19c3b8c2SApple OSS Distributions T_DECL(settime_32089962_entitled_not_root,
49*19c3b8c2SApple OSS Distributions     "Verify that the \"com.apple.settime\" entitlement can allow to change the time",
50*19c3b8c2SApple OSS Distributions     T_META_ASROOT(false), T_META_CHECK_LEAKS(false))
51*19c3b8c2SApple OSS Distributions {
52*19c3b8c2SApple OSS Distributions 	struct timeval settimeofdaytime;
53*19c3b8c2SApple OSS Distributions 	struct timeval adj_time;
54*19c3b8c2SApple OSS Distributions 	struct timex ntptime;
55*19c3b8c2SApple OSS Distributions 
56*19c3b8c2SApple OSS Distributions 	if (geteuid() == 0) {
57*19c3b8c2SApple OSS Distributions 		T_SKIP("settime_32089962_entitled_root test requires no root privileges to run.");
58*19c3b8c2SApple OSS Distributions 	}
59*19c3b8c2SApple OSS Distributions 
60*19c3b8c2SApple OSS Distributions 	/* test settimeofday */
61*19c3b8c2SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_ZERO(gettimeofday(&settimeofdaytime, NULL), NULL);
62*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_ZERO(settimeofday(&settimeofdaytime, NULL), NULL);
63*19c3b8c2SApple OSS Distributions 
64*19c3b8c2SApple OSS Distributions 	/* test adjtime */
65*19c3b8c2SApple OSS Distributions 	adj_time.tv_sec = 1;
66*19c3b8c2SApple OSS Distributions 	adj_time.tv_usec = 0;
67*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_ZERO(adjtime(&adj_time, NULL), NULL);
68*19c3b8c2SApple OSS Distributions 
69*19c3b8c2SApple OSS Distributions 	/* test ntp_adjtime */
70*19c3b8c2SApple OSS Distributions 	memset(&ntptime, 0, sizeof(ntptime));
71*19c3b8c2SApple OSS Distributions 	ntptime.modes |= MOD_STATUS;
72*19c3b8c2SApple OSS Distributions 	ntptime.status = TIME_OK;
73*19c3b8c2SApple OSS Distributions 
74*19c3b8c2SApple OSS Distributions 	T_ASSERT_EQ(ntp_adjtime(&ntptime), TIME_OK, NULL);
75*19c3b8c2SApple OSS Distributions }
76*19c3b8c2SApple OSS Distributions 
77*19c3b8c2SApple OSS Distributions T_DECL(settimeofday_29193041_entitled_root,
78*19c3b8c2SApple OSS Distributions     "Verify that root privileges can allow to change the time",
79*19c3b8c2SApple OSS Distributions     T_META_ASROOT(true), T_META_CHECK_LEAKS(false))
80*19c3b8c2SApple OSS Distributions {
81*19c3b8c2SApple OSS Distributions 	struct timeval time;
82*19c3b8c2SApple OSS Distributions 	long new_time;
83*19c3b8c2SApple OSS Distributions 
84*19c3b8c2SApple OSS Distributions 	if (geteuid() != 0) {
85*19c3b8c2SApple OSS Distributions 		T_SKIP("settimeofday_root_29193041 test requires root privileges to run.");
86*19c3b8c2SApple OSS Distributions 	}
87*19c3b8c2SApple OSS Distributions 
88*19c3b8c2SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_ZERO(gettimeofday(&time, NULL), NULL);
89*19c3b8c2SApple OSS Distributions 
90*19c3b8c2SApple OSS Distributions 	/* increment the time of one day */
91*19c3b8c2SApple OSS Distributions 	new_time = time.tv_sec + DAY;
92*19c3b8c2SApple OSS Distributions 
93*19c3b8c2SApple OSS Distributions 	time.tv_sec = new_time;
94*19c3b8c2SApple OSS Distributions 	time.tv_usec = 0;
95*19c3b8c2SApple OSS Distributions 
96*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_ZERO(settimeofday(&time, NULL), NULL);
97*19c3b8c2SApple OSS Distributions 
98*19c3b8c2SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_ZERO(gettimeofday(&time, NULL), NULL);
99*19c3b8c2SApple OSS Distributions 
100*19c3b8c2SApple OSS Distributions 	/* expext to be past new_time */
101*19c3b8c2SApple OSS Distributions 	T_EXPECT_GE_LONG(time.tv_sec, new_time, "Time changed with root and entitlement");
102*19c3b8c2SApple OSS Distributions 
103*19c3b8c2SApple OSS Distributions 	time.tv_sec -= DAY;
104*19c3b8c2SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_ZERO(settimeofday(&time, NULL), NULL);
105*19c3b8c2SApple OSS Distributions }
106*19c3b8c2SApple OSS Distributions 
107*19c3b8c2SApple OSS Distributions T_DECL(settimeofday_29193041_entitled_not_root,
108*19c3b8c2SApple OSS Distributions     "Verify that the \"com.apple.settime\" entitlement can allow to change the time",
109*19c3b8c2SApple OSS Distributions     T_META_ASROOT(false), T_META_CHECK_LEAKS(false))
110*19c3b8c2SApple OSS Distributions {
111*19c3b8c2SApple OSS Distributions 	struct timeval time;
112*19c3b8c2SApple OSS Distributions 	long new_time;
113*19c3b8c2SApple OSS Distributions 
114*19c3b8c2SApple OSS Distributions 	if (geteuid() == 0) {
115*19c3b8c2SApple OSS Distributions 		T_SKIP("settimeofday_29193041 test requires no root privileges to run.");
116*19c3b8c2SApple OSS Distributions 	}
117*19c3b8c2SApple OSS Distributions 
118*19c3b8c2SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_ZERO(gettimeofday(&time, NULL), NULL);
119*19c3b8c2SApple OSS Distributions 
120*19c3b8c2SApple OSS Distributions 	/* increment the time of one day */
121*19c3b8c2SApple OSS Distributions 	new_time = time.tv_sec + DAY;
122*19c3b8c2SApple OSS Distributions 
123*19c3b8c2SApple OSS Distributions 	time.tv_sec = new_time;
124*19c3b8c2SApple OSS Distributions 	time.tv_usec = 0;
125*19c3b8c2SApple OSS Distributions 
126*19c3b8c2SApple OSS Distributions 	T_ASSERT_POSIX_ZERO(settimeofday(&time, NULL), NULL);
127*19c3b8c2SApple OSS Distributions 
128*19c3b8c2SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_ZERO(gettimeofday(&time, NULL), NULL);
129*19c3b8c2SApple OSS Distributions 
130*19c3b8c2SApple OSS Distributions 	/* expext to be past new_time */
131*19c3b8c2SApple OSS Distributions 	T_EXPECT_GE_LONG(time.tv_sec, new_time, "Time successfully changed without root and with entitlement");
132*19c3b8c2SApple OSS Distributions 
133*19c3b8c2SApple OSS Distributions 	time.tv_sec -= DAY;
134*19c3b8c2SApple OSS Distributions 	T_QUIET; T_ASSERT_POSIX_ZERO(settimeofday(&time, NULL), NULL);
135*19c3b8c2SApple OSS Distributions }
136