// https://syzkaller.appspot.com/bug?id=3f499a32212d3652038a94ab109207ddbebf36d8 // autogenerated by syzkaller (https://github.com/google/syzkaller) #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef __NR_bpf #define __NR_bpf 321 #endif 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 int inject_fault(int nth) { int fd; fd = open("/proc/thread-self/fail-nth", O_RDWR); if (fd == -1) exit(1); char buf[16]; sprintf(buf, "%d", nth); if (write(fd, buf, strlen(buf)) != (ssize_t)strlen(buf)) exit(1); return fd; } static const char* setup_fault() { int fd = open("/proc/self/make-it-fail", O_WRONLY); if (fd == -1) return "CONFIG_FAULT_INJECTION is not enabled"; close(fd); fd = open("/proc/thread-self/fail-nth", O_WRONLY); if (fd == -1) return "kernel does not have systematic fault injection support"; close(fd); static struct { const char* file; const char* val; bool fatal; } files[] = { {"/sys/kernel/debug/failslab/ignore-gfp-wait", "N", true}, {"/sys/kernel/debug/fail_futex/ignore-private", "N", false}, {"/sys/kernel/debug/fail_page_alloc/ignore-gfp-highmem", "N", false}, {"/sys/kernel/debug/fail_page_alloc/ignore-gfp-wait", "N", false}, {"/sys/kernel/debug/fail_page_alloc/min-order", "0", false}, }; unsigned i; for (i = 0; i < sizeof(files) / sizeof(files[0]); i++) { if (!write_file(files[i].file, files[i].val)) { if (files[i].fatal) return "failed to write fault injection file"; } } return NULL; } uint64_t r[4] = {0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff}; int main(void) { syscall(__NR_mmap, /*addr=*/0x1ffffffff000ul, /*len=*/0x1000ul, /*prot=*/0ul, /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/(intptr_t)-1, /*offset=*/0ul); syscall(__NR_mmap, /*addr=*/0x200000000000ul, /*len=*/0x1000000ul, /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7ul, /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/(intptr_t)-1, /*offset=*/0ul); syscall(__NR_mmap, /*addr=*/0x200001000000ul, /*len=*/0x1000ul, /*prot=*/0ul, /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32ul, /*fd=*/(intptr_t)-1, /*offset=*/0ul); const char* reason; (void)reason; if ((reason = setup_fault())) printf("the reproducer may not work as expected: fault injection setup " "failed: %s\n", reason); intptr_t res = 0; if (write(1, "executing program\n", sizeof("executing program\n") - 1)) { } *(uint32_t*)0x20000000e000 = 0x10; *(uint32_t*)0x20000000e004 = 4; *(uint64_t*)0x20000000e008 = 0x200000000040; memcpy((void*)0x200000000040, "\xb4\x00\x00\x00\x00\x00\x00\x00\x79\x10\x48\x00\x00\x00\x00\x00\x61" "\x04\x00\x00\x00\x00\x00\x00\x95\x00\x00\x80", 28); *(uint64_t*)0x20000000e010 = 0x200000003ff6; memcpy((void*)0x200000003ff6, "GPL\000", 4); *(uint32_t*)0x20000000e018 = 2; *(uint32_t*)0x20000000e01c = 0xfd90; *(uint64_t*)0x20000000e020 = 0x20000000cf3d; *(uint32_t*)0x20000000e028 = 0; *(uint32_t*)0x20000000e02c = 0; memset((void*)0x20000000e030, 0, 16); *(uint32_t*)0x20000000e040 = 0; *(uint32_t*)0x20000000e044 = 0; *(uint32_t*)0x20000000e048 = -1; *(uint32_t*)0x20000000e04c = 8; *(uint64_t*)0x20000000e050 = 0; *(uint32_t*)0x20000000e058 = 0; *(uint32_t*)0x20000000e05c = 0x10; *(uint64_t*)0x20000000e060 = 0; *(uint32_t*)0x20000000e068 = 0; *(uint32_t*)0x20000000e06c = 0; *(uint32_t*)0x20000000e070 = -1; *(uint32_t*)0x20000000e074 = 0; *(uint64_t*)0x20000000e078 = 0; *(uint64_t*)0x20000000e080 = 0; *(uint32_t*)0x20000000e088 = 0x10; *(uint32_t*)0x20000000e08c = 0; *(uint32_t*)0x20000000e090 = 0; res = syscall(__NR_bpf, /*cmd=*/5ul, /*arg=*/0x20000000e000ul, /*size=*/0x48ul); if (res != -1) r[0] = res; syscall(__NR_close, /*fd=*/r[0]); res = syscall(__NR_socketpair, /*domain=*/1ul, /*type=SOCK_STREAM*/ 1ul, /*proto=*/0, /*fds=*/0x2000000029c0ul); if (res != -1) r[1] = *(uint32_t*)0x2000000029c4; *(uint32_t*)0x20000000e000 = 0xe; *(uint32_t*)0x20000000e004 = 4; *(uint64_t*)0x20000000e008 = 0x200000000540; memcpy( (void*)0x200000000540, "\xb4\x05\x00\x00\xfd\xff\x7f\x00\x61\x10\x58\x00\x00\x00\x00\x00\xc6\x00" "\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x9f\x33\xef\x60" "\x91\x6e\x6e\x71\x3f\x1e\xeb\x0b\x72\x5a\xd9\x9b\x81\x7f\xd9\x8c\xd8\x07" "\x3a\x46\xb0\x8b\x94\x21\x4d\x81\x6f\x77\x06\x00\xdc\xca\x55\xf2\x1f\x3c" "\xa9\xe8\x22\xd1\x82\x05\x4d\x54\xd5\x3c\xd2\xb6\xdb\x71\x4e\x4b\xeb\x41" "\x47\x00\x00\x01\x00\x00\x00\x00\x8f\x2b\x90\x00\xf2\x24\x25\xe4\x09\x7e" "\xd6\x2c\xbc\x89\x10\x61\x01\x7c\xfa\x6f\x61\x48\xa1\xc1\xe4\x3f\x00\x00" "\x1b\xde\x60\xbe\xac\x67\x1e\x8e\x8f\xde\xcb\x03\x58\x8a\xa6\x23\xfa\x71" "\xf3\x1b\xf0\xf8\x71\xab\x5c\x2f\xf8\x8a\xfc\x60\x02\x7f\x4e\x5b\x52\x71" "\xed\x58\xe8\x35\xcf\x0d\x00\x00\x00\x00\x98\xb5\x1f\xe6\x8d\xb8\xd9\xdb" "\xe8\x7d\xcf\xf4\x14\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x47\xab" "\xe6\x35\x2a\x08\x0f\x81\x40\xe5\xfd\x10\x74\x7b\x6e\xcd\xb3\x54\x26\x46" "\xbf\x63\x6e\x3d\x6e\x70\x0e\x5b\x05\x00\x00\x00\x00\x00\x00\x00\xeb\x9e" "\x14\x03\xe6\xc8\xf7\xa1\x87\xea\xf6\x0f\x3a\x17\xf0\xf0\x46\xa3\x07\xa4" "\x03\xc1\x9d\x98\x29\xc9\x0b\xd2\x11\x42\x52\x58\x15\x67\xac\xae\x71\x5c" "\xbe\x1b\x57\xd5\xcd\xa4\x32\xc5\xb9\x10\x40\x06\x23\xd2\x41\x95\x40\x5f" "\x2e\x76\xcc\xb7\xb3\x7b\x41\x21\x5c\x18\x4e\x73\x1f\xb1", 320); *(uint64_t*)0x20000000e010 = 0x200000003ff6; memcpy((void*)0x200000003ff6, "GPL\000", 4); *(uint32_t*)0x20000000e018 = 4; *(uint32_t*)0x20000000e01c = 0xfd90; *(uint64_t*)0x20000000e020 = 0x20000000cf3d; *(uint32_t*)0x20000000e028 = 0; *(uint32_t*)0x20000000e02c = 0; memset((void*)0x20000000e030, 0, 16); *(uint32_t*)0x20000000e040 = 0; *(uint32_t*)0x20000000e044 = 0; *(uint32_t*)0x20000000e048 = -1; *(uint32_t*)0x20000000e04c = 8; *(uint64_t*)0x20000000e050 = 0x200000000000; *(uint32_t*)0x200000000000 = 0; *(uint32_t*)0x200000000004 = 0; *(uint32_t*)0x20000000e058 = 0x366; *(uint32_t*)0x20000000e05c = 0x10; *(uint64_t*)0x20000000e060 = 0x200000000000; *(uint32_t*)0x200000000000 = 0; *(uint32_t*)0x200000000004 = 0; *(uint32_t*)0x200000000008 = 0; *(uint32_t*)0x20000000000c = 0; *(uint32_t*)0x20000000e068 = 0x1dd; *(uint32_t*)0x20000000e06c = 0; *(uint32_t*)0x20000000e070 = -1; *(uint32_t*)0x20000000e074 = 0; *(uint64_t*)0x20000000e078 = 0; *(uint64_t*)0x20000000e080 = 0; *(uint32_t*)0x20000000e088 = 0x10; *(uint32_t*)0x20000000e08c = 0; *(uint32_t*)0x20000000e090 = 0; res = syscall(__NR_bpf, /*cmd=*/5ul, /*arg=*/0x20000000e000ul, /*size=*/0x48ul); if (res != -1) r[2] = res; *(uint32_t*)0x200000000100 = 0xf; *(uint32_t*)0x200000000104 = 4; *(uint32_t*)0x200000000108 = 4; *(uint32_t*)0x20000000010c = 0x12; *(uint32_t*)0x200000000110 = 0; *(uint32_t*)0x200000000114 = -1; *(uint32_t*)0x200000000118 = 0; memset((void*)0x20000000011c, 0, 16); *(uint32_t*)0x20000000012c = 0; *(uint32_t*)0x200000000130 = -1; *(uint32_t*)0x200000000134 = 0; *(uint32_t*)0x200000000138 = 0; *(uint32_t*)0x20000000013c = 0; *(uint64_t*)0x200000000140 = 0; *(uint32_t*)0x200000000148 = 0; *(uint32_t*)0x20000000014c = 0; res = syscall(__NR_bpf, /*cmd=*/0ul, /*arg=*/0x200000000100ul, /*size=*/0x50ul); if (res != -1) r[3] = res; *(uint32_t*)0x200000000080 = r[3]; *(uint32_t*)0x200000000084 = r[2]; *(uint32_t*)0x200000000088 = 0x26; *(uint32_t*)0x20000000008c = 0; *(uint32_t*)0x200000000090 = 0; *(uint32_t*)0x200000000094 = -1; *(uint64_t*)0x200000000098 = 0; syscall(__NR_bpf, /*cmd=*/8ul, /*arg=*/0x200000000080ul, /*size=*/0x10ul); *(uint32_t*)0x2000000000c0 = r[3]; *(uint64_t*)0x2000000000c8 = 0x200000000000; *(uint32_t*)0x200000000000 = 0; *(uint64_t*)0x2000000000d0 = 0x200000000080; *(uint32_t*)0x200000000080 = r[0]; *(uint64_t*)0x2000000000d8 = 0; syscall(__NR_bpf, /*cmd=*/2ul, /*arg=*/0x2000000000c0ul, /*size=*/0x20ul); *(uint64_t*)0x200000000500 = 0; *(uint32_t*)0x200000000508 = 0x4000000; *(uint64_t*)0x200000000510 = 0x200000001740; *(uint64_t*)0x200000001740 = 0x200000000280; memset((void*)0x200000000280, 62, 1); *(uint64_t*)0x200000001748 = 0x20000281; *(uint64_t*)0x200000000518 = 1; *(uint64_t*)0x200000000520 = 0; *(uint64_t*)0x200000000528 = 0; *(uint32_t*)0x200000000530 = 0; inject_fault(10); syscall(__NR_sendmsg, /*fd=*/r[1], /*msg=*/0x200000000500ul, /*f=*/0ul); return 0; }