// https://syzkaller.appspot.com/bug?id=12ffde0f016e7572c26e71bda369ec9f5b857e63 // autogenerated by syzkaller (https://github.com/google/syzkaller) #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #ifndef __NR_mmap #define __NR_mmap 192 #endif #ifndef __NR_mremap #define __NR_mremap 163 #endif #undef __NR_mmap #define __NR_mmap __NR_mmap2 static long syz_open_dev(volatile long a0, volatile long a1, volatile long a2) { if (a0 == 0xc || a0 == 0xb) { char buf[128]; sprintf(buf, "/dev/%s/%d:%d", a0 == 0xc ? "char" : "block", (uint8_t)a1, (uint8_t)a2); return open(buf, O_RDWR, 0); } else { unsigned long nb = a1; char buf[1024]; char* hash; strncpy(buf, (char*)a0, sizeof(buf) - 1); buf[sizeof(buf) - 1] = 0; while ((hash = strchr(buf, '#'))) { *hash = '0' + (char)(nb % 10); nb /= 10; } return open(buf, a2 & ~O_CREAT, 0); } } int main(void) { syscall(__NR_mmap, /*addr=*/0x7ffff000, /*len=*/0x1000, /*prot=*/0, /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32, /*fd=*/(intptr_t)-1, /*offset=*/0); syscall(__NR_mmap, /*addr=*/0x80000000, /*len=*/0x1000000, /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7, /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32, /*fd=*/(intptr_t)-1, /*offset=*/0); syscall(__NR_mmap, /*addr=*/0x81000000, /*len=*/0x1000, /*prot=*/0, /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x32, /*fd=*/(intptr_t)-1, /*offset=*/0); const char* reason; (void)reason; if (write(1, "executing program\n", sizeof("executing program\n") - 1)) { } // syz_open_dev$sg arguments: [ // dev: ptr[in, buffer] { // buffer: {2f 64 65 76 2f 73 67 23 00} (length 0x9) // } // id: intptr = 0x10000004000 (4 bytes) // flags: open_flags = 0x1 (4 bytes) // ] // returns fd_sg memcpy((void*)0x80000000, "/dev/sg#\000", 9); syz_open_dev(/*dev=*/0x80000000, /*id=*/0x4000, /*flags=O_WRONLY*/ 1); // mremap arguments: [ // addr: VMA[0x4000] // len: len = 0x200000 (4 bytes) // newlen: len = 0x4000 (4 bytes) // flags: mremap_flags = 0x3 (4 bytes) // newaddr: VMA[0x4000] // ] syscall(__NR_mremap, /*addr=*/0x80002000, /*len=*/0x200000, /*newlen=*/0x4000, /*flags=MREMAP_FIXED|MREMAP_MAYMOVE*/ 3, /*newaddr=*/0x80ffc000); // mremap arguments: [ // addr: VMA[0x4000] // len: len = 0x4000 (4 bytes) // newlen: len = 0x4000 (4 bytes) // flags: mremap_flags = 0x7 (4 bytes) // newaddr: VMA[0x4000] // ] syscall(__NR_mremap, /*addr=*/0x80ffc000, /*len=*/0x4000, /*newlen=*/0x4000, /*flags=MREMAP_DONTUNMAP|MREMAP_FIXED|MREMAP_MAYMOVE*/ 7, /*newaddr=*/0x80002000); // mmap arguments: [ // addr: VMA[0x4000] // len: len = 0x4000 (4 bytes) // prot: mmap_prot = 0x0 (4 bytes) // flags: mmap_flags = 0x840000000000a132 (4 bytes) // fd: fd (resource) // offset: intptr = 0xff46d000 (4 bytes) // ] syscall(__NR_mmap, /*addr=*/0x80ffb000, /*len=*/0x4000, /*prot=*/0, /*flags=MAP_POPULATE|MAP_LOCKED|MAP_GROWSDOWN|MAP_FIXED|0x22*/ 0xa132, /*fd=*/(intptr_t)-1, /*offset=*/0xff46d000); return 0; }