1*baa489faSSeongJae Park // SPDX-License-Identifier: GPL-2.0
2*baa489faSSeongJae Park #include <sys/mman.h>
3*baa489faSSeongJae Park #include <stdio.h>
4*baa489faSSeongJae Park #include <unistd.h>
5*baa489faSSeongJae Park #include <string.h>
6*baa489faSSeongJae Park #include <sys/time.h>
7*baa489faSSeongJae Park #include <sys/resource.h>
8*baa489faSSeongJae Park 
test_limit(void)9*baa489faSSeongJae Park static int test_limit(void)
10*baa489faSSeongJae Park {
11*baa489faSSeongJae Park 	int ret = 1;
12*baa489faSSeongJae Park 	struct rlimit lims;
13*baa489faSSeongJae Park 	void *map;
14*baa489faSSeongJae Park 
15*baa489faSSeongJae Park 	if (getrlimit(RLIMIT_MEMLOCK, &lims)) {
16*baa489faSSeongJae Park 		perror("getrlimit");
17*baa489faSSeongJae Park 		return ret;
18*baa489faSSeongJae Park 	}
19*baa489faSSeongJae Park 
20*baa489faSSeongJae Park 	if (mlockall(MCL_ONFAULT | MCL_FUTURE)) {
21*baa489faSSeongJae Park 		perror("mlockall");
22*baa489faSSeongJae Park 		return ret;
23*baa489faSSeongJae Park 	}
24*baa489faSSeongJae Park 
25*baa489faSSeongJae Park 	map = mmap(NULL, 2 * lims.rlim_max, PROT_READ | PROT_WRITE,
26*baa489faSSeongJae Park 		   MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0);
27*baa489faSSeongJae Park 	if (map != MAP_FAILED)
28*baa489faSSeongJae Park 		printf("mmap should have failed, but didn't\n");
29*baa489faSSeongJae Park 	else {
30*baa489faSSeongJae Park 		ret = 0;
31*baa489faSSeongJae Park 		munmap(map, 2 * lims.rlim_max);
32*baa489faSSeongJae Park 	}
33*baa489faSSeongJae Park 
34*baa489faSSeongJae Park 	munlockall();
35*baa489faSSeongJae Park 	return ret;
36*baa489faSSeongJae Park }
37*baa489faSSeongJae Park 
main(int argc,char ** argv)38*baa489faSSeongJae Park int main(int argc, char **argv)
39*baa489faSSeongJae Park {
40*baa489faSSeongJae Park 	int ret = 0;
41*baa489faSSeongJae Park 
42*baa489faSSeongJae Park 	ret += test_limit();
43*baa489faSSeongJae Park 	return ret;
44*baa489faSSeongJae Park }
45