xref: /linux/tools/testing/selftests/bpf/unpriv_helpers.c (revision 40d269c000bda9fcd276a0412a9cebd3f6e344c5)
1 // SPDX-License-Identifier: GPL-2.0-only
2 
3 #include <stdbool.h>
4 #include <stdlib.h>
5 #include <error.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <unistd.h>
9 #include <fcntl.h>
10 
11 #include "unpriv_helpers.h"
12 
13 static bool get_mitigations_off(void)
14 {
15 	char cmdline[4096], *c;
16 	int fd, ret = false;
17 
18 	fd = open("/proc/cmdline", O_RDONLY);
19 	if (fd < 0) {
20 		perror("open /proc/cmdline");
21 		return false;
22 	}
23 
24 	if (read(fd, cmdline, sizeof(cmdline) - 1) < 0) {
25 		perror("read /proc/cmdline");
26 		goto out;
27 	}
28 
29 	cmdline[sizeof(cmdline) - 1] = '\0';
30 	for (c = strtok(cmdline, " \n"); c; c = strtok(NULL, " \n")) {
31 		if (strncmp(c, "mitigations=off", strlen(c)))
32 			continue;
33 		ret = true;
34 		break;
35 	}
36 out:
37 	close(fd);
38 	return ret;
39 }
40 
41 bool get_unpriv_disabled(void)
42 {
43 	bool disabled;
44 	char buf[2];
45 	FILE *fd;
46 
47 	fd = fopen("/proc/sys/" UNPRIV_SYSCTL, "r");
48 	if (fd) {
49 		disabled = (fgets(buf, 2, fd) == buf && atoi(buf));
50 		fclose(fd);
51 	} else {
52 		perror("fopen /proc/sys/" UNPRIV_SYSCTL);
53 		disabled = true;
54 	}
55 
56 	return disabled ? true : get_mitigations_off();
57 }
58