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 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 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