xref: /xnu-8792.81.2/tests/proc_rlimit.c (revision 19c3b8c28c31cb8130e034cfb5df6bf9ba342d90)
1*19c3b8c2SApple OSS Distributions /*
2*19c3b8c2SApple OSS Distributions  * cd $XNU/tests
3*19c3b8c2SApple OSS Distributions  * xcrun -sdk macosx.internal/iphoneos.internal make proc_rlimit LDFLAGS="-ldarwintest"
4*19c3b8c2SApple OSS Distributions  */
5*19c3b8c2SApple OSS Distributions #include <stdio.h>
6*19c3b8c2SApple OSS Distributions #include <unistd.h>
7*19c3b8c2SApple OSS Distributions #include <sys/resource.h>
8*19c3b8c2SApple OSS Distributions #include <errno.h>
9*19c3b8c2SApple OSS Distributions #include <sys/sysctl.h>
10*19c3b8c2SApple OSS Distributions #include <darwintest.h>
11*19c3b8c2SApple OSS Distributions 
12*19c3b8c2SApple OSS Distributions /* Defined in <sys/resource.h> but not visible to user space */
13*19c3b8c2SApple OSS Distributions #define RLIMIT_NLIMITS 9
14*19c3b8c2SApple OSS Distributions 
15*19c3b8c2SApple OSS Distributions /* Defined in <sys/resource.h> and visible to user space */
16*19c3b8c2SApple OSS Distributions static const char *RESOURCE_STRING[] = {
17*19c3b8c2SApple OSS Distributions 	"RLIMIT_CPU",     /* #define RLIMIT_CPU      0 */
18*19c3b8c2SApple OSS Distributions 	"RLIMIT_FSIZE",   /* #define RLIMIT_FSIZE    1 */
19*19c3b8c2SApple OSS Distributions 	"RLIMIT_DATA",    /* #define RLIMIT_DATA     2 */
20*19c3b8c2SApple OSS Distributions 	"RLIMIT_STACK",   /* #define RLIMIT_STACK    3 */
21*19c3b8c2SApple OSS Distributions 	"RLIMIT_CORE",    /* #define RLIMIT_CORE     4 */
22*19c3b8c2SApple OSS Distributions 	"RLIMIT_AS/RSS",  /* #define RLIMIT_AS       5 */
23*19c3b8c2SApple OSS Distributions 	/* #define RLIMIT_RSS      RLIMIT_AS */
24*19c3b8c2SApple OSS Distributions 	"RLIMIT_MEMLOCK", /* #define RLIMIT_MEMLOCK  6 */
25*19c3b8c2SApple OSS Distributions 	"RLIMIT_NPROC",   /* #define RLIMIT_NPROC    7 */
26*19c3b8c2SApple OSS Distributions 	"RLIMIT_NOFILE"   /* #define RLIMIT_NOFILE   8 */
27*19c3b8c2SApple OSS Distributions };
28*19c3b8c2SApple OSS Distributions 
29*19c3b8c2SApple OSS Distributions /* Change limit values by this arbitrary amount */
30*19c3b8c2SApple OSS Distributions #define LIMIT_DIFF 64
31*19c3b8c2SApple OSS Distributions 
32*19c3b8c2SApple OSS Distributions /* Limit type */
33*19c3b8c2SApple OSS Distributions #define SOFT_LIMIT 0
34*19c3b8c2SApple OSS Distributions #define HARD_LIMIT 1
35*19c3b8c2SApple OSS Distributions 
36*19c3b8c2SApple OSS Distributions /* Action on changing limit values */
37*19c3b8c2SApple OSS Distributions #define LOWER 0
38*19c3b8c2SApple OSS Distributions #define RAISE 1
39*19c3b8c2SApple OSS Distributions 
40*19c3b8c2SApple OSS Distributions static struct rlimit orig_rlimit[RLIMIT_NLIMITS];
41*19c3b8c2SApple OSS Distributions 
42*19c3b8c2SApple OSS Distributions /* Maximum number of open files allowed by normal user */
43*19c3b8c2SApple OSS Distributions static rlim_t maxfilesperproc;
44*19c3b8c2SApple OSS Distributions static size_t maxfilesperproc_size = sizeof(maxfilesperproc);
45*19c3b8c2SApple OSS Distributions 
46*19c3b8c2SApple OSS Distributions /* Maximum number of open files allowed by super user */
47*19c3b8c2SApple OSS Distributions static rlim_t maxfiles;
48*19c3b8c2SApple OSS Distributions static size_t maxfiles_size = sizeof(maxfiles);
49*19c3b8c2SApple OSS Distributions 
50*19c3b8c2SApple OSS Distributions /* Maximum number of simultaneous processes allowed by normal user */
51*19c3b8c2SApple OSS Distributions static rlim_t maxprocperuid;
52*19c3b8c2SApple OSS Distributions static size_t maxprocperuid_size = sizeof(maxprocperuid);
53*19c3b8c2SApple OSS Distributions 
54*19c3b8c2SApple OSS Distributions /* Maximum number of simultaneous processes allowed by super user */
55*19c3b8c2SApple OSS Distributions static rlim_t maxproc;
56*19c3b8c2SApple OSS Distributions static size_t maxproc_size = sizeof(maxproc);
57*19c3b8c2SApple OSS Distributions 
58*19c3b8c2SApple OSS Distributions static bool superuser = FALSE;
59*19c3b8c2SApple OSS Distributions 
60*19c3b8c2SApple OSS Distributions static int
get_initial_rlimits(void)61*19c3b8c2SApple OSS Distributions get_initial_rlimits(void)
62*19c3b8c2SApple OSS Distributions {
63*19c3b8c2SApple OSS Distributions 	int err = -1;
64*19c3b8c2SApple OSS Distributions 	int i;
65*19c3b8c2SApple OSS Distributions 
66*19c3b8c2SApple OSS Distributions 	for (i = 0; i < RLIMIT_NLIMITS; i++) {
67*19c3b8c2SApple OSS Distributions 		err = getrlimit(i, &orig_rlimit[i]);
68*19c3b8c2SApple OSS Distributions 		T_QUIET; T_EXPECT_EQ(0, err, "getrlimit(%15s, soft: 0x%16llx, hard 0x%16llx) %s", RESOURCE_STRING[i], orig_rlimit[i].rlim_cur, orig_rlimit[i].rlim_max, err == 0 ? "" : strerror(errno));
69*19c3b8c2SApple OSS Distributions 	}
70*19c3b8c2SApple OSS Distributions 	return err;
71*19c3b8c2SApple OSS Distributions }
72*19c3b8c2SApple OSS Distributions 
73*19c3b8c2SApple OSS Distributions static void
print_rlimits(bool initial_limits)74*19c3b8c2SApple OSS Distributions print_rlimits(bool initial_limits)
75*19c3b8c2SApple OSS Distributions {
76*19c3b8c2SApple OSS Distributions 	int err;
77*19c3b8c2SApple OSS Distributions 	int i;
78*19c3b8c2SApple OSS Distributions 
79*19c3b8c2SApple OSS Distributions 	for (i = 0; i < RLIMIT_NLIMITS; i++) {
80*19c3b8c2SApple OSS Distributions 		struct rlimit lim;
81*19c3b8c2SApple OSS Distributions 
82*19c3b8c2SApple OSS Distributions 		if (initial_limits) {
83*19c3b8c2SApple OSS Distributions 			lim = orig_rlimit[i];
84*19c3b8c2SApple OSS Distributions 		} else {
85*19c3b8c2SApple OSS Distributions 			err = getrlimit(i, &lim);
86*19c3b8c2SApple OSS Distributions 			T_QUIET; T_EXPECT_EQ(0, err, "getrlimit(%15s, soft: 0x%16llx, hard 0x%16llx) %s", RESOURCE_STRING[i], lim.rlim_cur, lim.rlim_max, err == 0 ? "" : strerror(errno));
87*19c3b8c2SApple OSS Distributions 		}
88*19c3b8c2SApple OSS Distributions 		T_LOG("%35s soft: 0x%16llx hard 0x%16llx", RESOURCE_STRING[i], lim.rlim_cur, lim.rlim_max);
89*19c3b8c2SApple OSS Distributions 	}
90*19c3b8c2SApple OSS Distributions }
91*19c3b8c2SApple OSS Distributions 
92*19c3b8c2SApple OSS Distributions /*
93*19c3b8c2SApple OSS Distributions  * Change "limit_type" of all of the process's "rlimit" by amount
94*19c3b8c2SApple OSS Distributions  *
95*19c3b8c2SApple OSS Distributions  * limit_type: SOFT_LIMIT/HARD_LIMIT
96*19c3b8c2SApple OSS Distributions  * amount:     rlim_t
97*19c3b8c2SApple OSS Distributions  * action:     RAISE/LOWER
98*19c3b8c2SApple OSS Distributions  */
99*19c3b8c2SApple OSS Distributions static void
change_rlimits(int limit_type,rlim_t amount,int action)100*19c3b8c2SApple OSS Distributions change_rlimits(int limit_type, rlim_t amount, int action)
101*19c3b8c2SApple OSS Distributions {
102*19c3b8c2SApple OSS Distributions 	int err = -1;
103*19c3b8c2SApple OSS Distributions 	int i;
104*19c3b8c2SApple OSS Distributions 
105*19c3b8c2SApple OSS Distributions 	for (i = 0; i < RLIMIT_NLIMITS; i++) {
106*19c3b8c2SApple OSS Distributions 		struct rlimit newlim;     // for setrlimit
107*19c3b8c2SApple OSS Distributions 		struct rlimit verifylim;  // for getrlimit
108*19c3b8c2SApple OSS Distributions 		bool expect_failure = FALSE;
109*19c3b8c2SApple OSS Distributions 		int expect_errno = 0;
110*19c3b8c2SApple OSS Distributions 
111*19c3b8c2SApple OSS Distributions 		/* Get the current limit values */
112*19c3b8c2SApple OSS Distributions 		err = getrlimit(i, &newlim);
113*19c3b8c2SApple OSS Distributions 		T_EXPECT_EQ(0, err, "getrlimit(%15s, soft: 0x%16llx, hard 0x%16llx) %s", RESOURCE_STRING[i], newlim.rlim_cur, newlim.rlim_max, err == 0 ? "" : strerror(errno));
114*19c3b8c2SApple OSS Distributions 
115*19c3b8c2SApple OSS Distributions 		/* Changing soft limit */
116*19c3b8c2SApple OSS Distributions 		if (limit_type == SOFT_LIMIT) {
117*19c3b8c2SApple OSS Distributions 			if (action == RAISE) {
118*19c3b8c2SApple OSS Distributions 				/* Raising soft limits to exceed hard limits is not allowed and we expect to see failure on setrlimit call later */
119*19c3b8c2SApple OSS Distributions 				if (newlim.rlim_cur + amount > newlim.rlim_max) {
120*19c3b8c2SApple OSS Distributions 					expect_failure = TRUE;
121*19c3b8c2SApple OSS Distributions 					expect_errno = EINVAL;
122*19c3b8c2SApple OSS Distributions 				}
123*19c3b8c2SApple OSS Distributions 				newlim.rlim_cur += amount;
124*19c3b8c2SApple OSS Distributions 			} else if (action == LOWER) {
125*19c3b8c2SApple OSS Distributions 				if (newlim.rlim_cur == 0) {
126*19c3b8c2SApple OSS Distributions 					/* Soft limit might be 0 already, if so skip lowering it */
127*19c3b8c2SApple OSS Distributions 				} else {
128*19c3b8c2SApple OSS Distributions 					newlim.rlim_cur -= amount;
129*19c3b8c2SApple OSS Distributions 				}
130*19c3b8c2SApple OSS Distributions 			} else {
131*19c3b8c2SApple OSS Distributions 				T_FAIL("Unknown action on soft limit: %d", action);
132*19c3b8c2SApple OSS Distributions 			}
133*19c3b8c2SApple OSS Distributions 		}
134*19c3b8c2SApple OSS Distributions 		/* Changing hard limit */
135*19c3b8c2SApple OSS Distributions 		else if (limit_type == HARD_LIMIT) {
136*19c3b8c2SApple OSS Distributions 			if (action == RAISE) {
137*19c3b8c2SApple OSS Distributions 				newlim.rlim_max += amount;
138*19c3b8c2SApple OSS Distributions 
139*19c3b8c2SApple OSS Distributions 				/* Raising hard limits is not allowed for normal user and we expect to see failure on setrlimit call later */
140*19c3b8c2SApple OSS Distributions 				expect_failure = TRUE;
141*19c3b8c2SApple OSS Distributions 				expect_errno = EPERM;
142*19c3b8c2SApple OSS Distributions 			} else if (action == LOWER) {
143*19c3b8c2SApple OSS Distributions 				if (newlim.rlim_max == 0) {
144*19c3b8c2SApple OSS Distributions 					/* Hard limit might be 0 already, if so skip lowering it (e.g., RLIMIT_CORE on iOS) */
145*19c3b8c2SApple OSS Distributions 				} else {
146*19c3b8c2SApple OSS Distributions 					newlim.rlim_max -= amount;
147*19c3b8c2SApple OSS Distributions 				}
148*19c3b8c2SApple OSS Distributions 				/* Soft limit might need to be changed as well since soft cannot be greater than hard  */
149*19c3b8c2SApple OSS Distributions 				if (newlim.rlim_cur > newlim.rlim_max) {
150*19c3b8c2SApple OSS Distributions 					newlim.rlim_cur = newlim.rlim_max;
151*19c3b8c2SApple OSS Distributions 				}
152*19c3b8c2SApple OSS Distributions 			} else {
153*19c3b8c2SApple OSS Distributions 				T_FAIL("Unknown action on hard limit: %d", action);
154*19c3b8c2SApple OSS Distributions 			}
155*19c3b8c2SApple OSS Distributions 		}
156*19c3b8c2SApple OSS Distributions 		/* Changing unknown limit type */
157*19c3b8c2SApple OSS Distributions 		else {
158*19c3b8c2SApple OSS Distributions 			T_FAIL("Unknown limit type: %d", limit_type);
159*19c3b8c2SApple OSS Distributions 		}
160*19c3b8c2SApple OSS Distributions 
161*19c3b8c2SApple OSS Distributions 		/* Request the kernel to change limit values */
162*19c3b8c2SApple OSS Distributions 		err = setrlimit(i, &newlim);
163*19c3b8c2SApple OSS Distributions 
164*19c3b8c2SApple OSS Distributions 		if (expect_failure) {
165*19c3b8c2SApple OSS Distributions 			/* We expect the setrlimit call to fail */
166*19c3b8c2SApple OSS Distributions 			T_EXPECT_EQ(-1, err, "setrlimit(%15s, soft: 0x%16llx, hard 0x%16llx) failed as expected: %s", RESOURCE_STRING[i], newlim.rlim_cur, newlim.rlim_max, strerror(errno));
167*19c3b8c2SApple OSS Distributions 			T_EXPECT_EQ(expect_errno, errno, "Expect errno %d, errno returned %d", expect_errno, errno);
168*19c3b8c2SApple OSS Distributions 			continue;
169*19c3b8c2SApple OSS Distributions 		} else {
170*19c3b8c2SApple OSS Distributions 			T_EXPECT_EQ(0, err, "setrlimit(%15s, soft: 0x%16llx, hard 0x%16llx) %s", RESOURCE_STRING[i], newlim.rlim_cur, newlim.rlim_max, err == 0 ? "" : strerror(errno));
171*19c3b8c2SApple OSS Distributions 		}
172*19c3b8c2SApple OSS Distributions 
173*19c3b8c2SApple OSS Distributions 		/* Verify the kernel correctly changed the limit values */
174*19c3b8c2SApple OSS Distributions 		err = getrlimit(i, &verifylim);
175*19c3b8c2SApple OSS Distributions 		T_EXPECT_EQ(0, err, "getrlimit(%15s, soft: 0x%16llx, hard 0x%16llx) %s", RESOURCE_STRING[i], verifylim.rlim_cur, verifylim.rlim_max, err == 0 ? "" : strerror(errno));
176*19c3b8c2SApple OSS Distributions 
177*19c3b8c2SApple OSS Distributions 		/* The kernel forces the hard limit of RLIMIT_NOFILE to be at most maxfileperproc for normal user when changing the hard limit with setrlimit */
178*19c3b8c2SApple OSS Distributions 		if (i == RLIMIT_NOFILE && limit_type == HARD_LIMIT && newlim.rlim_max > maxfilesperproc) {
179*19c3b8c2SApple OSS Distributions 			if (newlim.rlim_cur != verifylim.rlim_cur ||
180*19c3b8c2SApple OSS Distributions 			    maxfilesperproc != verifylim.rlim_max) {
181*19c3b8c2SApple OSS Distributions 				T_FAIL("Mismatch limit values %s despite a successful setrlimit call (setrlimit'd soft 0x%16llx hard 0x%16llx but getrlimit'd soft 0x%16llx hard 0x%16llx)",
182*19c3b8c2SApple OSS Distributions 				    RESOURCE_STRING[i], newlim.rlim_cur, newlim.rlim_max, verifylim.rlim_cur, verifylim.rlim_max);
183*19c3b8c2SApple OSS Distributions 			}
184*19c3b8c2SApple OSS Distributions 		}
185*19c3b8c2SApple OSS Distributions 		/* The kernel forces the hard limit of RLIMIT_NPROC to be at most maxproc for normal user when changing either soft/hard limit with setrlimit */
186*19c3b8c2SApple OSS Distributions 		else if (i == RLIMIT_NPROC && newlim.rlim_max > maxprocperuid) {
187*19c3b8c2SApple OSS Distributions 			if (newlim.rlim_cur != verifylim.rlim_cur ||
188*19c3b8c2SApple OSS Distributions 			    maxprocperuid != verifylim.rlim_max) {
189*19c3b8c2SApple OSS Distributions 				T_FAIL("Mismatch limit values %s despite a successful setrlimit call (setrlimit'd soft 0x%16llx hard 0x%16llx but getrlimit'd soft 0x%16llx hard 0x%16llx)",
190*19c3b8c2SApple OSS Distributions 				    RESOURCE_STRING[i], newlim.rlim_cur, newlim.rlim_max, verifylim.rlim_cur, verifylim.rlim_max);
191*19c3b8c2SApple OSS Distributions 			}
192*19c3b8c2SApple OSS Distributions 		} else {
193*19c3b8c2SApple OSS Distributions 			if (newlim.rlim_cur != verifylim.rlim_cur ||
194*19c3b8c2SApple OSS Distributions 			    newlim.rlim_max != verifylim.rlim_max) {
195*19c3b8c2SApple OSS Distributions 				T_FAIL("Mismatch limit values %s despite a successful setrlimit call (setrlimit'd soft 0x%16llx hard 0x%16llx but getrlimit'd soft 0x%16llx hard 0x%16llx)",
196*19c3b8c2SApple OSS Distributions 				    RESOURCE_STRING[i], newlim.rlim_cur, newlim.rlim_max, verifylim.rlim_cur, verifylim.rlim_max);
197*19c3b8c2SApple OSS Distributions 			}
198*19c3b8c2SApple OSS Distributions 		}
199*19c3b8c2SApple OSS Distributions 	}
200*19c3b8c2SApple OSS Distributions }
201*19c3b8c2SApple OSS Distributions 
202*19c3b8c2SApple OSS Distributions T_DECL(proc_rlimit,
203*19c3b8c2SApple OSS Distributions     "Test basic functionalities of the getrlimit and setrlimit")
204*19c3b8c2SApple OSS Distributions {
205*19c3b8c2SApple OSS Distributions 	int err;
206*19c3b8c2SApple OSS Distributions 	struct rlimit lim;
207*19c3b8c2SApple OSS Distributions 
208*19c3b8c2SApple OSS Distributions 	T_SETUPBEGIN;
209*19c3b8c2SApple OSS Distributions 
210*19c3b8c2SApple OSS Distributions 	if (geteuid() == 0) {
211*19c3b8c2SApple OSS Distributions 		superuser = TRUE;
212*19c3b8c2SApple OSS Distributions 		T_SKIP("This test should not be run as super user.");
213*19c3b8c2SApple OSS Distributions 	}
214*19c3b8c2SApple OSS Distributions 
215*19c3b8c2SApple OSS Distributions 	/* Use sysctl to query the real limits of RLIMIT_NOFILE/RLIMIT_NPROC for normal user on Apple's systems */
216*19c3b8c2SApple OSS Distributions 	err = sysctlbyname("kern.maxfilesperproc", &maxfilesperproc, &maxfilesperproc_size, NULL, 0);
217*19c3b8c2SApple OSS Distributions 	T_EXPECT_EQ_INT(0, err, "maxfilesperproc: %llu", maxfilesperproc);
218*19c3b8c2SApple OSS Distributions 
219*19c3b8c2SApple OSS Distributions 	err = sysctlbyname("kern.maxprocperuid", &maxprocperuid, &maxprocperuid_size, NULL, 0);
220*19c3b8c2SApple OSS Distributions 	T_EXPECT_EQ_INT(0, err, "maxprocperuid: %llu", maxprocperuid);
221*19c3b8c2SApple OSS Distributions 
222*19c3b8c2SApple OSS Distributions 	/* Use sysctl to query the real limits of RLIMIT_NOFILE/RLIMIT_NPROC for super user on Apple's systems (placeholder for adding super user tests) */
223*19c3b8c2SApple OSS Distributions 	err = sysctlbyname("kern.maxfiles", &maxfiles, &maxfiles_size, NULL, 0);
224*19c3b8c2SApple OSS Distributions 	T_EXPECT_EQ_INT(0, err, "maxfiles: %llu", maxfiles);
225*19c3b8c2SApple OSS Distributions 
226*19c3b8c2SApple OSS Distributions 	err = sysctlbyname("kern.maxproc", &maxproc, &maxproc_size, NULL, 0);
227*19c3b8c2SApple OSS Distributions 	T_EXPECT_EQ_INT(0, err, "maxproc: %llu", maxproc);
228*19c3b8c2SApple OSS Distributions 
229*19c3b8c2SApple OSS Distributions 	/* Issue getrlimit syscall to retrieve the initial resource limit values before calling setrlimit */
230*19c3b8c2SApple OSS Distributions 	err = get_initial_rlimits();
231*19c3b8c2SApple OSS Distributions 	T_EXPECT_EQ(0, err, "Obtained initial resource values.");
232*19c3b8c2SApple OSS Distributions 
233*19c3b8c2SApple OSS Distributions 	/* Print out resource limit values to stdout for less-painful triage in case needed */
234*19c3b8c2SApple OSS Distributions 	T_LOG("Resource limits before the test:");
235*19c3b8c2SApple OSS Distributions 	print_rlimits(TRUE);
236*19c3b8c2SApple OSS Distributions 
237*19c3b8c2SApple OSS Distributions 	T_SETUPEND;
238*19c3b8c2SApple OSS Distributions 
239*19c3b8c2SApple OSS Distributions 	/* Lower soft limits by arbitrary amount */
240*19c3b8c2SApple OSS Distributions 	T_LOG("---------Lowering soft limits by 0x%x---------:\n", LIMIT_DIFF);
241*19c3b8c2SApple OSS Distributions 	change_rlimits(SOFT_LIMIT, LIMIT_DIFF, LOWER);
242*19c3b8c2SApple OSS Distributions 
243*19c3b8c2SApple OSS Distributions 	/* Raise soft limits back to the orginal values */
244*19c3b8c2SApple OSS Distributions 	T_LOG("---------Raising soft limits by 0x%x---------:\n", LIMIT_DIFF);
245*19c3b8c2SApple OSS Distributions 	change_rlimits(SOFT_LIMIT, LIMIT_DIFF, RAISE);
246*19c3b8c2SApple OSS Distributions 
247*19c3b8c2SApple OSS Distributions 	/* Lower hard limits */
248*19c3b8c2SApple OSS Distributions 	T_LOG("---------Lowering hard limits by 0x%x---------:", LIMIT_DIFF);
249*19c3b8c2SApple OSS Distributions 	change_rlimits(HARD_LIMIT, LIMIT_DIFF, LOWER);
250*19c3b8c2SApple OSS Distributions 
251*19c3b8c2SApple OSS Distributions 	/* Raise soft limits to exceed hard limits (setrlimit should fail, but the darwintest should pass) */
252*19c3b8c2SApple OSS Distributions 	T_LOG("---------Attempting to raised soft limits by 0x%x to exceed hard limits---------:", LIMIT_DIFF);
253*19c3b8c2SApple OSS Distributions 	change_rlimits(SOFT_LIMIT, LIMIT_DIFF, RAISE);
254*19c3b8c2SApple OSS Distributions 
255*19c3b8c2SApple OSS Distributions 	/* Raise hard limits (setrlimit should fail, but the darwintest should pass) */
256*19c3b8c2SApple OSS Distributions 	T_LOG("---------Attempting to raise hard limits by 0x%x---------:", LIMIT_DIFF);
257*19c3b8c2SApple OSS Distributions 	change_rlimits(HARD_LIMIT, LIMIT_DIFF, RAISE);
258*19c3b8c2SApple OSS Distributions 
259*19c3b8c2SApple OSS Distributions 	/* Get and set a non-existing resource limit */
260*19c3b8c2SApple OSS Distributions 	T_LOG("---------Accessing a non-existing resource---------:");
261*19c3b8c2SApple OSS Distributions 	err = getrlimit(RLIMIT_NLIMITS + 1, &lim);
262*19c3b8c2SApple OSS Distributions 	T_EXPECT_EQ(-1, err, "Expect getrlimit to fail when accessing a non-existing resource: %s\n", strerror(errno));
263*19c3b8c2SApple OSS Distributions 	T_EXPECT_EQ(EINVAL, errno, "Expect errno %d, errno returned %d", EINVAL, errno);
264*19c3b8c2SApple OSS Distributions 
265*19c3b8c2SApple OSS Distributions 	err = setrlimit(RLIMIT_NLIMITS + 1, &lim);
266*19c3b8c2SApple OSS Distributions 	T_EXPECT_EQ(-1, err, "Expect setrlimit to fail when accessing a non-existing resource: %s\n", strerror(errno));
267*19c3b8c2SApple OSS Distributions 	T_EXPECT_EQ(EINVAL, errno, "Expect errno %d, errno returned %d", EINVAL, errno);
268*19c3b8c2SApple OSS Distributions 
269*19c3b8c2SApple OSS Distributions 	T_LOG("Resource limits after the test:");
270*19c3b8c2SApple OSS Distributions 	print_rlimits(FALSE);
271*19c3b8c2SApple OSS Distributions }
272