// autogenerated by syzkaller (http://github.com/google/syzkaller) #ifndef __NR_socket #define __NR_socket 41 #endif #ifndef __NR_setsockopt #define __NR_setsockopt 54 #endif #ifndef __NR_mmap #define __NR_mmap 9 #endif #ifndef __NR_shutdown #define __NR_shutdown 48 #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include __thread int skip_segv; __thread jmp_buf segv_env; static void segv_handler(int sig, siginfo_t* info, void* uctx) { if (__atomic_load_n(&skip_segv, __ATOMIC_RELAXED)) _longjmp(segv_env, 1); exit(sig); } static void install_segv_handler() { struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_sigaction = segv_handler; sa.sa_flags = SA_NODEFER | SA_SIGINFO; sigaction(SIGSEGV, &sa, NULL); sigaction(SIGBUS, &sa, NULL); } #define NONFAILING(...) \ { \ __atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST); \ if (_setjmp(segv_env) == 0) { \ __VA_ARGS__; \ } \ __atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST); \ } static uintptr_t execute_syscall(int nr, uintptr_t a0, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8) { switch (nr) { default: return syscall(nr, a0, a1, a2, a3, a4, a5); } } long r[14]; void* thr(void* arg) { switch ((long)arg) { case 0: r[0] = execute_syscall(__NR_mmap, 0x20000000ul, 0x332000ul, 0x3ul, 0x32ul, 0xfffffffffffffffful, 0x0ul, 0, 0, 0); break; case 1: r[1] = execute_syscall(__NR_socket, 0x2ul, 0x1ul, 0x0ul, 0, 0, 0, 0, 0, 0); break; case 2: r[2] = execute_syscall(__NR_socket, 0xaul, 0x1ul, 0x84ul, 0, 0, 0, 0, 0, 0); break; case 3: r[3] = execute_syscall(__NR_shutdown, r[2], 0x0ul, 0, 0, 0, 0, 0, 0, 0); break; case 4: NONFAILING(*(uint16_t*)0x20008fe4 = (uint16_t)0xa); NONFAILING(*(uint16_t*)0x20008fe6 = (uint16_t)0x4242); NONFAILING(*(uint32_t*)0x20008fe8 = (uint32_t)0x1ddb); NONFAILING(*(uint32_t*)0x20008fec = (uint32_t)0x5); NONFAILING(*(uint32_t*)0x20008ff0 = (uint32_t)0xffff); NONFAILING(*(uint32_t*)0x20008ff4 = (uint32_t)0x7); NONFAILING(*(uint32_t*)0x20008ff8 = (uint32_t)0x0); NONFAILING(*(uint32_t*)0x20008ffc = (uint32_t)0xffffffffffffff23); r[12] = execute_syscall(__NR_setsockopt, r[2], 0x84ul, 0x6eul, 0x20008fe4ul, 0x1cul, 0, 0, 0, 0); break; case 5: r[13] = execute_syscall(__NR_shutdown, r[2], 0x1ul, 0, 0, 0, 0, 0, 0, 0); break; } return 0; } int main() { long i; pthread_t th[12]; install_segv_handler(); memset(r, -1, sizeof(r)); srand(getpid()); for (i = 0; i < 6; i++) { pthread_create(&th[i], 0, thr, (void*)i); usleep(10000); } for (i = 0; i < 6; i++) { pthread_create(&th[6 + i], 0, thr, (void*)i); if (rand() % 2) usleep(rand() % 10000); } usleep(100000); return 0; }