// https://syzkaller.appspot.com/bug?id=84eb6336ee2426ddc34156f2cabba8c7e22c84d1 #define _GNU_SOURCE #include #include #include #include #include #include #include #include #define MAX_FILES 256 #define NUM_THREADS 8 #define ITERATIONS 10000 char target_files[MAX_FILES][256]; int num_files = 0; void *read_status(void *arg) { char buf[64]; for (int i = 0; i < ITERATIONS; i++) { for (int j = 0; j < num_files; j++) { int fd = open(target_files[j], O_RDONLY); if (fd >= 0) { if (read(fd, buf, sizeof(buf)) < 0) { /* Ignore read errors as we just want to trigger ACPI methods */ } close(fd); } } } return NULL; } int main(void) { DIR *dir = opendir("/sys/bus/acpi/devices"); if (!dir) { printf("[-] Failed to opendir /sys/bus/acpi/devices: %s\n", strerror(errno)); exit(1); } printf("[+] opendir /sys/bus/acpi/devices successful.\n"); struct dirent *ent; while ((ent = readdir(dir)) != NULL && num_files < MAX_FILES) { if (ent->d_name[0] == '.') continue; snprintf(target_files[num_files], sizeof(target_files[num_files]), "/sys/bus/acpi/devices/%s/status", ent->d_name); if (access(target_files[num_files], R_OK) == 0) { num_files++; } } closedir(dir); if (num_files == 0) { printf("[-] No readable ACPI status files found.\n"); exit(1); } printf("[+] Found %d readable ACPI status files.\n", num_files); pthread_t threads[NUM_THREADS]; for (int i = 0; i < NUM_THREADS; i++) { int res = pthread_create(&threads[i], NULL, read_status, NULL); if (res != 0) { printf("[-] Failed to pthread_create: %s\n", strerror(res)); exit(1); } } printf("[+] pthread_create successful.\n"); for (int i = 0; i < NUM_THREADS; i++) { int res = pthread_join(threads[i], NULL); if (res != 0) { printf("[-] Failed to pthread_join: %s\n", strerror(res)); exit(1); } } printf("[+] pthread_join successful.\n"); return 0; }