// https://syzkaller.appspot.com/bug?id=041201fb49924bd252ae4b68d404ac21560b3df2 // autogenerated by syzkaller (https://github.com/google/syzkaller) #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static void sleep_ms(uint64_t ms) { usleep(ms * 1000); } static uint64_t current_time_ms(void) { struct timespec ts; if (clock_gettime(CLOCK_MONOTONIC, &ts)) exit(1); return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; } static bool write_file(const char* file, const char* what, ...) { char buf[1024]; va_list args; va_start(args, what); vsnprintf(buf, sizeof(buf), what, args); va_end(args); buf[sizeof(buf) - 1] = 0; int len = strlen(buf); int fd = open(file, O_WRONLY | O_CLOEXEC); if (fd == -1) return false; if (write(fd, buf, len) != len) { int err = errno; close(fd); errno = err; return false; } close(fd); return true; } static void kill_and_wait(int pid, int* status) { kill(-pid, SIGKILL); kill(pid, SIGKILL); for (int i = 0; i < 100; i++) { if (waitpid(-1, status, WNOHANG | __WALL) == pid) return; usleep(1000); } DIR* dir = opendir("/sys/fs/fuse/connections"); if (dir) { for (;;) { struct dirent* ent = readdir(dir); if (!ent) break; if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) continue; char abort[300]; snprintf(abort, sizeof(abort), "/sys/fs/fuse/connections/%s/abort", ent->d_name); int fd = open(abort, O_WRONLY); if (fd == -1) { continue; } if (write(fd, abort, 1) < 0) { } close(fd); } closedir(dir); } else { } while (waitpid(-1, status, __WALL) != pid) { } } static void setup_test() { prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0); setpgrp(); write_file("/proc/self/oom_score_adj", "1000"); } static void execute_one(void); #define WAIT_FLAGS __WALL static void loop(void) { int iter = 0; for (;; iter++) { int pid = fork(); if (pid < 0) exit(1); if (pid == 0) { setup_test(); execute_one(); exit(0); } int status = 0; uint64_t start = current_time_ms(); for (;;) { if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid) break; sleep_ms(1); if (current_time_ms() - start < 5000) { continue; } kill_and_wait(pid, &status); break; } } } uint64_t r[6] = {0xffffffffffffffff, 0x0, 0xffffffffffffffff, 0xffffffffffffffff, 0x0, 0xffffffffffffffff}; void execute_one(void) { intptr_t res = 0; res = syscall(__NR_socket, 0x11ul, 0x800000003ul, 0); if (res != -1) r[0] = res; *(uint16_t*)0x20000080 = 0x11; memcpy((void*)0x20000082, "\x00\x00\x01\x00\x00\x00\x00\x00\x08\x00\x44\x94\x4e\xeb\xa7\x1a\x49" "\x76\xe2\x52\x92\x2c\xb1\x8f\x6e\x2e\x2a\xba\x00\x00\x00\x01\x2e\x0b" "\x38\x36\x00\x54\x04\xb0\xe0\x30\x1a\x4c\xe8\x75\xf2\xe3\xff\x5f\x16" "\x3e\xe3\x40\xb7\x67\x95\x00\x80\x00\x00\x00\x00\x00\x00\x01\x01\x01" "\x3c\x58\x11\x03\x9e\x15\x77\x50\x27\xec\xce\x66\xfd\x79\x2b\xbf\x0e" "\x5b\xf5\xff\x1b\x08\x16\xf3\xf6\xdb\x1c\x00\x01\x00\x00\x00\x00\x00" "\x00\x00\x49\x74\x00\x00\x00\x00\x00\x00\x00\x06\xad\x8e\x5e\xcc\x32" "\x6d\x3a\x09\xff\xc2\xc6\x54", 126); syscall(__NR_bind, r[0], 0x20000080ul, 0x80ul); *(uint32_t*)0x20000000 = 0x14; res = syscall(__NR_getsockname, r[0], 0x200003c0ul, 0x20000000ul); if (res != -1) r[1] = *(uint32_t*)0x200003c4; res = syscall(__NR_socket, 0x10ul, 3ul, 0); if (res != -1) r[2] = res; *(uint64_t*)0x200007c0 = 0; *(uint32_t*)0x200007c8 = 0; *(uint64_t*)0x200007d0 = 0x20000780; *(uint64_t*)0x20000780 = 0x20000400; *(uint32_t*)0x20000400 = 0x148; *(uint16_t*)0x20000404 = 0x24; *(uint16_t*)0x20000406 = 0xd0b; *(uint32_t*)0x20000408 = 0; *(uint32_t*)0x2000040c = 0; *(uint8_t*)0x20000410 = 0; *(uint8_t*)0x20000411 = 0; *(uint16_t*)0x20000412 = 0; *(uint32_t*)0x20000414 = r[1]; *(uint16_t*)0x20000418 = 0; *(uint16_t*)0x2000041a = 0; *(uint16_t*)0x2000041c = 0xd; *(uint16_t*)0x2000041e = -1; *(uint16_t*)0x20000420 = 0; *(uint16_t*)0x20000422 = 0; *(uint16_t*)0x20000424 = 8; *(uint16_t*)0x20000426 = 1; memcpy((void*)0x20000428, "red\000", 4); *(uint16_t*)0x2000042c = 0x11c; *(uint16_t*)0x2000042e = 2; *(uint16_t*)0x20000430 = 0x104; *(uint16_t*)0x20000432 = 2; memcpy((void*)0x20000434, "\x35\x3f\x9a\x6f\x83\xc1\xa3\x02\xf1\x8d\xb2\x58\x79\x23\x67\x6d\x91" "\x43\x3e\xb3\x09\xeb\x52\xb0\x48\x43\x70\x1d\xb4\xb5\x49\xd6\xff\xd9" "\x28\xa5\xc2\x42\xde\xf4\x5b\xd4\xd2\x35\xc7\xc9\x39\xe8\xcd\xbe\x71" "\xdd\x13\x22\x51\xf5\x94\xd6\xef\x5f\x06\x81\x08\x38\x8a\x74\x40\x0b" "\x47\xf8\xdb\xfa\x55\x08\xc3\x1c\x4f\x39\xd6\x26\xef\xe6\x02\x37\x0f" "\x32\x3c\xcc\xbd\x6c\x5f\x63\x33\xe4\x4c\xf6\xe5\x5c\x9f\xa1\x30\x46" "\xc4\xd8\x04\xd1\x4a\x1b\x86\x18\xd5\xb1\xb6\x4c\xa0\xc7\x73\xd0\xb4" "\x96\x87\xcd\x51\xb8\xf4\x3c\x4d\xb2\xbb\x0a\xbc\xb3\xe5\x4e\x4d\x06" "\xf4\x9c\x18\xe3\xf0\xc5\xa1\x17\x4d\x60\x90\x27\x65\x5a\x08\x2d\x68" "\xf6\x7e\xc3\x8b\xf4\x93\x87\xe0\x6a\xfd\xe1\xcd\xf3\xc5\xec\x87\xfb" "\x53\xde\x13\x08\x87\x06\x22\xd3\x29\x0e\x4e\x92\xc4\x8a\xa0\x5b\xaf" "\x6c\x12\x3f\x3b\x57\x86\xe4\x4e\x63\x8b\x5e\xc6\xb9\x72\xb9\x32\x59" "\x3b\xf5\x93\x98\x20\xdc\xdb\xbd\x7b\xf6\xfc\xdf\x31\xd2\x75\x9f\x09" "\xe7\x79\xdd\xbb\x1a\xc7\xf1\x6d\x64\xd6\xff\x7d\xd2\xb7\x0b\x80\x3d" "\x9a\xd7\x46\x41\xb2\x32\x4b\x88\x25\xbd\x3f\x4a\x9e\x53\x1c\xa8\xc4" "\x47", 256); *(uint16_t*)0x20000534 = 0x14; *(uint16_t*)0x20000536 = 1; *(uint32_t*)0x20000538 = 0x1000; *(uint32_t*)0x2000053c = 0; *(uint32_t*)0x20000540 = 0; *(uint8_t*)0x20000544 = 0; *(uint8_t*)0x20000545 = 0; *(uint8_t*)0x20000546 = 0; *(uint8_t*)0x20000547 = 6; *(uint64_t*)0x20000788 = 0x148; *(uint64_t*)0x200007d8 = 1; *(uint64_t*)0x200007e0 = 0; *(uint64_t*)0x200007e8 = 0; *(uint32_t*)0x200007f0 = 0x8040; syscall(__NR_sendmsg, r[2], 0x200007c0ul, 0ul); res = syscall(__NR_socket, 0x11ul, 0x800000003ul, 0); if (res != -1) r[3] = res; *(uint16_t*)0x20000080 = 0x11; memcpy((void*)0x20000082, "\x00\x00\x01\x00\x00\x00\x00\x00\x08\x00\x44\x94\x4e\xeb\xa7\x1a\x49" "\x76\xe2\x52\x92\x2c\xb1\x8f\x6e\x2e\x2a\xba\x00\x00\x00\x01\x2e\x0b" "\x38\x36\x00\x54\x04\xb0\xe0\x30\x1a\x4c\xe8\x75\xf2\xe3\xff\x5f\x16" "\x3e\xe3\x40\xb7\x67\x95\x00\x80\x00\x00\x00\x00\x00\x00\x01\x01\x01" "\x3c\x58\x11\x03\x9e\x15\x77\x50\x27\xec\xce\x66\xfd\x79\x2b\xbf\x0e" "\x5b\xf5\xff\x1b\x08\x16\xf3\xf6\xdb\x1c\x00\x01\x00\x00\x00\x00\x00" "\x00\x00\x49\x74\x00\x00\x00\x00\x00\x00\x00\x06\xad\x8e\x5e\xcc\x32" "\x6d\x3a\x09\xff\xc2\xc6\x54", 126); syscall(__NR_bind, r[3], 0x20000080ul, 0x80ul); *(uint32_t*)0x20000000 = 0x14; res = syscall(__NR_getsockname, r[3], 0x200003c0ul, 0x20000000ul); if (res != -1) r[4] = *(uint32_t*)0x200003c4; res = syscall(__NR_socket, 0x10ul, 3ul, 0); if (res != -1) r[5] = res; *(uint64_t*)0x200007c0 = 0; *(uint32_t*)0x200007c8 = 0; *(uint64_t*)0x200007d0 = 0x20000780; *(uint64_t*)0x20000780 = 0x20000400; *(uint32_t*)0x20000400 = 0x148; *(uint16_t*)0x20000404 = 0x24; *(uint16_t*)0x20000406 = 0xd0b; *(uint32_t*)0x20000408 = 0; *(uint32_t*)0x2000040c = 0; *(uint8_t*)0x20000410 = 0; *(uint8_t*)0x20000411 = 0; *(uint16_t*)0x20000412 = 0; *(uint32_t*)0x20000414 = r[4]; *(uint16_t*)0x20000418 = 0; *(uint16_t*)0x2000041a = 0; *(uint16_t*)0x2000041c = 0xfff1; *(uint16_t*)0x2000041e = -1; *(uint16_t*)0x20000420 = 0; *(uint16_t*)0x20000422 = 0; *(uint16_t*)0x20000424 = 8; *(uint16_t*)0x20000426 = 1; memcpy((void*)0x20000428, "red\000", 4); *(uint16_t*)0x2000042c = 0x11c; *(uint16_t*)0x2000042e = 2; *(uint16_t*)0x20000430 = 0x104; *(uint16_t*)0x20000432 = 2; memcpy((void*)0x20000434, "\x35\x3f\x9a\x6f\x83\xc1\xa3\x02\xf1\x8d\xb2\x58\x79\x23\x67\x6d\x91" "\x43\x3e\xb3\x09\xeb\x52\xb0\x48\x43\x70\x1d\xb4\xb5\x49\xd6\xff\xd9" "\x28\xa5\xc2\x42\xde\xf4\x5b\xd4\xd2\x35\xc7\xc9\x39\xe8\xcd\xbe\x71" "\xdd\x13\x22\x51\xf5\x94\xd6\xef\x5f\x06\x81\x08\x38\x8a\x74\x40\x0b" "\x47\xf8\xdb\xfa\x55\x08\xc3\x1c\x4f\x39\xd6\x26\xef\xe6\x02\x37\x0f" "\x32\x3c\xcc\xbd\x6c\x5f\x63\x33\xe4\x4c\xf6\xe5\x5c\x9f\xa1\x30\x46" "\xc4\xd8\x04\xd1\x4a\x1b\x86\x18\xd5\xb1\xb6\x4c\xa0\xc7\x73\xd0\xb4" "\x96\x87\xcd\x51\xb8\xf4\x3c\x4d\xb2\xbb\x0a\xbc\xb3\xe5\x4e\x4d\x06" "\xf4\x9c\x18\xe3\xf0\xc5\xa1\x17\x4d\x60\x90\x27\x65\x5a\x08\x2d\x68" "\xf6\x7e\xc3\x8b\xf4\x93\x87\xe0\x6a\xfd\xe1\xcd\xf3\xc5\xec\x87\xfb" "\x53\xde\x13\x08\x87\x06\x22\xd3\x29\x0e\x4e\x92\xc4\x8a\xa0\x5b\xaf" "\x6c\x12\x3f\x3b\x57\x86\xe4\x4e\x63\x8b\x5e\xc6\xb9\x72\xb9\x32\x59" "\x3b\xf5\x93\x98\x20\xdc\xdb\xbd\x7b\xf6\xfc\xdf\x31\xd2\x75\x9f\x09" "\xe7\x79\xdd\xbb\x1a\xc7\xf1\x6d\x64\xd6\xff\x7d\xd2\xb7\x0b\x80\x3d" "\x9a\xd7\x46\x41\xb2\x32\x4b\x88\x25\xbd\x3f\x4a\x9e\x53\x1c\xa8\xc4" "\x47", 256); *(uint16_t*)0x20000534 = 0x14; *(uint16_t*)0x20000536 = 1; *(uint32_t*)0x20000538 = 0x1000; *(uint32_t*)0x2000053c = 0; *(uint32_t*)0x20000540 = 0; *(uint8_t*)0x20000544 = 0; *(uint8_t*)0x20000545 = 0; *(uint8_t*)0x20000546 = 0; *(uint8_t*)0x20000547 = 6; *(uint64_t*)0x20000788 = 0x148; *(uint64_t*)0x200007d8 = 1; *(uint64_t*)0x200007e0 = 0; *(uint64_t*)0x200007e8 = 0; *(uint32_t*)0x200007f0 = 0x8040; syscall(__NR_sendmsg, r[5], 0x200007c0ul, 0ul); syscall(__NR_clone, 0x70224100ul, 0ul, 0ul, 0ul, 0ul); } int main(void) { syscall(__NR_mmap, 0x1ffff000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul); syscall(__NR_mmap, 0x20000000ul, 0x1000000ul, 7ul, 0x32ul, -1, 0ul); syscall(__NR_mmap, 0x21000000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul); loop(); return 0; }