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