1e14e0a16SPeter Holm#!/bin/sh 2e14e0a16SPeter Holm 3e14e0a16SPeter Holm# panic: Counter goes negative 4e14e0a16SPeter Holm# cpuid = 8 5e14e0a16SPeter Holm# time = 1653397881 6e14e0a16SPeter Holm# KDB: stack backtrace: 7e14e0a16SPeter Holm# db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe014386fa40 8e14e0a16SPeter Holm# vpanic() at vpanic+0x17f/frame 0xfffffe014386fa90 9e14e0a16SPeter Holm# panic() at panic+0x43/frame 0xfffffe014386faf0 10e14e0a16SPeter Holm# sctp_sorecvmsg() at sctp_sorecvmsg+0xf8e/frame 0xfffffe014386fc10 11e14e0a16SPeter Holm# sctp_soreceive() at sctp_soreceive+0x196/frame 0xfffffe014386fe00 12e14e0a16SPeter Holm# soreceive() at soreceive+0x4b/frame 0xfffffe014386fe20 13e14e0a16SPeter Holm# soaio_process_sb() at soaio_process_sb+0x581/frame 0xfffffe014386feb0 14e14e0a16SPeter Holm# soaio_kproc_loop() at soaio_kproc_loop+0xa9/frame 0xfffffe014386fef0 15e14e0a16SPeter Holm# fork_exit() at fork_exit+0x80/frame 0xfffffe014386ff30 16e14e0a16SPeter Holm# fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe014386ff30 17e14e0a16SPeter Holm# --- trap 0xc, rip = 0x8220e08da, rsp = 0x820a211b8, rbp = 0x820a211e0 --- 18e14e0a16SPeter Holm# KDB: enter: panic 19e14e0a16SPeter Holm# [ thread pid 78762 tid 931834 ] 20e14e0a16SPeter Holm# Stopped at kdb_enter+0x32: movq $0,0x1278fc3(%rip) 21e14e0a16SPeter Holm# db> x/s version 22e14e0a16SPeter Holm# FreeBSD 14.0-CURRENT #0 reap-n255780-cbbb27164fa: Tue May 24 13:42:53 CEST 2022 23e14e0a16SPeter Holm# pho@mercat1.netperf.freebsd.org:/var/tmp/deviant3/sys/amd64/compile/PHO 24e14e0a16SPeter Holm# db> 25e14e0a16SPeter Holm 26e14e0a16SPeter Holm[ `uname -p` != "amd64" ] && exit 0 27e14e0a16SPeter Holm 28e14e0a16SPeter Holm. ../default.cfg 29e14e0a16SPeter Holmcat > /tmp/syzkaller55.c <<EOF 30e14e0a16SPeter Holm// https://syzkaller.appspot.com/bug?id=ce7f451c017537296074d9203baaec292b311365 31e14e0a16SPeter Holm// autogenerated by syzkaller (https://github.com/google/syzkaller) 32e14e0a16SPeter Holm// Reported-by: syzbot+e256d42e9b390564530a@syzkaller.appspotmail.com 33e14e0a16SPeter Holm 34e14e0a16SPeter Holm#define _GNU_SOURCE 35e14e0a16SPeter Holm 36e14e0a16SPeter Holm#include <sys/types.h> 37e14e0a16SPeter Holm 38e14e0a16SPeter Holm#include <pwd.h> 39e14e0a16SPeter Holm#include <signal.h> 40e14e0a16SPeter Holm#include <stdarg.h> 41e14e0a16SPeter Holm#include <stdbool.h> 42e14e0a16SPeter Holm#include <stdint.h> 43e14e0a16SPeter Holm#include <stdio.h> 44e14e0a16SPeter Holm#include <stdlib.h> 45e14e0a16SPeter Holm#include <string.h> 46e14e0a16SPeter Holm#include <sys/endian.h> 47e14e0a16SPeter Holm#include <sys/syscall.h> 48e14e0a16SPeter Holm#include <sys/wait.h> 49e14e0a16SPeter Holm#include <time.h> 50e14e0a16SPeter Holm#include <unistd.h> 51e14e0a16SPeter Holm 52e14e0a16SPeter Holmstatic unsigned long long procid; 53e14e0a16SPeter Holm 54e14e0a16SPeter Holmstatic void kill_and_wait(int pid, int* status) 55e14e0a16SPeter Holm{ 56e14e0a16SPeter Holm kill(pid, SIGKILL); 57e14e0a16SPeter Holm while (waitpid(-1, status, 0) != pid) { 58e14e0a16SPeter Holm } 59e14e0a16SPeter Holm} 60e14e0a16SPeter Holm 61e14e0a16SPeter Holmstatic void sleep_ms(uint64_t ms) 62e14e0a16SPeter Holm{ 63e14e0a16SPeter Holm usleep(ms * 1000); 64e14e0a16SPeter Holm} 65e14e0a16SPeter Holm 66e14e0a16SPeter Holmstatic uint64_t current_time_ms(void) 67e14e0a16SPeter Holm{ 68e14e0a16SPeter Holm struct timespec ts; 69e14e0a16SPeter Holm if (clock_gettime(CLOCK_MONOTONIC, &ts)) 70e14e0a16SPeter Holm exit(1); 71e14e0a16SPeter Holm return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; 72e14e0a16SPeter Holm} 73e14e0a16SPeter Holm 74e14e0a16SPeter Holmstatic void execute_one(void); 75e14e0a16SPeter Holm 76e14e0a16SPeter Holm#define WAIT_FLAGS 0 77e14e0a16SPeter Holm 78e14e0a16SPeter Holmstatic void loop(void) 79e14e0a16SPeter Holm{ 80*7f658f99SPeter Holm int iter __unused = 0; 81e14e0a16SPeter Holm for (;; iter++) { 82e14e0a16SPeter Holm int pid = fork(); 83e14e0a16SPeter Holm if (pid < 0) 84e14e0a16SPeter Holm exit(1); 85e14e0a16SPeter Holm if (pid == 0) { 86e14e0a16SPeter Holm execute_one(); 87e14e0a16SPeter Holm exit(0); 88e14e0a16SPeter Holm } 89e14e0a16SPeter Holm int status = 0; 90e14e0a16SPeter Holm uint64_t start = current_time_ms(); 91e14e0a16SPeter Holm for (;;) { 92e14e0a16SPeter Holm if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid) 93e14e0a16SPeter Holm break; 94e14e0a16SPeter Holm sleep_ms(1); 95e14e0a16SPeter Holm if (current_time_ms() - start < 5000) 96e14e0a16SPeter Holm continue; 97e14e0a16SPeter Holm kill_and_wait(pid, &status); 98e14e0a16SPeter Holm break; 99e14e0a16SPeter Holm } 100e14e0a16SPeter Holm } 101e14e0a16SPeter Holm} 102e14e0a16SPeter Holm 103e14e0a16SPeter Holmuint64_t r[3] = {0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff}; 104e14e0a16SPeter Holm 105e14e0a16SPeter Holmvoid execute_one(void) 106e14e0a16SPeter Holm{ 107e14e0a16SPeter Holm intptr_t res = 0; 108e14e0a16SPeter Holm res = syscall(SYS_socket, 0x1cul, 1ul, 0x84); 109e14e0a16SPeter Holm if (res != -1) 110e14e0a16SPeter Holm r[0] = res; 111e14e0a16SPeter Holm *(uint8_t*)0x20000000 = 0x1c; 112e14e0a16SPeter Holm *(uint8_t*)0x20000001 = 0x1c; 113e14e0a16SPeter Holm *(uint16_t*)0x20000002 = htobe16(0x4e23 + procid * 4); 114e14e0a16SPeter Holm *(uint32_t*)0x20000004 = 0; 115e14e0a16SPeter Holm memset((void*)0x20000008, 0, 16); 116e14e0a16SPeter Holm *(uint32_t*)0x20000018 = 0; 117e14e0a16SPeter Holm syscall(SYS_bind, r[0], 0x20000000ul, 0x1cul); 118e14e0a16SPeter Holm *(uint8_t*)0x20000080 = 0x1c; 119e14e0a16SPeter Holm *(uint8_t*)0x20000081 = 0x1c; 120e14e0a16SPeter Holm *(uint16_t*)0x20000082 = htobe16(0x4e23 + procid * 4); 121e14e0a16SPeter Holm *(uint32_t*)0x20000084 = 0; 122e14e0a16SPeter Holm *(uint64_t*)0x20000088 = htobe64(0); 123e14e0a16SPeter Holm *(uint64_t*)0x20000090 = htobe64(1); 124e14e0a16SPeter Holm *(uint32_t*)0x20000098 = 0; 125e14e0a16SPeter Holm syscall(SYS_connect, r[0], 0x20000080ul, 0x1cul); 126e14e0a16SPeter Holm *(uint32_t*)0x20000400 = r[0]; 127e14e0a16SPeter Holm *(uint64_t*)0x20000408 = 0; 128e14e0a16SPeter Holm *(uint64_t*)0x20000410 = 0x20000040; 129e14e0a16SPeter Holm memset((void*)0x20000040, 27, 1); 130e14e0a16SPeter Holm *(uint64_t*)0x20000418 = 1; 131e14e0a16SPeter Holm *(uint32_t*)0x20000420 = 0; 132e14e0a16SPeter Holm *(uint32_t*)0x20000424 = 0; 133e14e0a16SPeter Holm *(uint64_t*)0x20000428 = 0; 134e14e0a16SPeter Holm *(uint32_t*)0x20000430 = 0; 135e14e0a16SPeter Holm *(uint32_t*)0x20000434 = 0; 136e14e0a16SPeter Holm *(uint64_t*)0x20000438 = 0; 137e14e0a16SPeter Holm *(uint64_t*)0x20000440 = 0; 138e14e0a16SPeter Holm *(uint64_t*)0x20000448 = 0; 139e14e0a16SPeter Holm *(uint32_t*)0x20000450 = 0; 140e14e0a16SPeter Holm *(uint32_t*)0x20000454 = 0; 141e14e0a16SPeter Holm *(uint32_t*)0x20000458 = 0; 142e14e0a16SPeter Holm *(uint64_t*)0x20000460 = 0; 143e14e0a16SPeter Holm *(uint64_t*)0x20000468 = 0; 144e14e0a16SPeter Holm *(uint64_t*)0x20000470 = 0; 145e14e0a16SPeter Holm *(uint64_t*)0x20000478 = 0; 146e14e0a16SPeter Holm *(uint64_t*)0x20000480 = 0; 147e14e0a16SPeter Holm *(uint64_t*)0x20000488 = 0; 148e14e0a16SPeter Holm *(uint64_t*)0x20000490 = 0; 149e14e0a16SPeter Holm *(uint64_t*)0x20000498 = 0; 150e14e0a16SPeter Holm syscall(SYS_aio_read, 0x20000400ul); 151e14e0a16SPeter Holm memset((void*)0x200000c0, 89, 1); 152e14e0a16SPeter Holm syscall(SYS_sendto, r[0], 0x200000c0ul, 1ul, 0ul, 0ul, 0ul); 153e14e0a16SPeter Holm syscall(SYS_shutdown, r[0], 0ul); 154e14e0a16SPeter Holm res = syscall(SYS_socket, 0x1cul, 5ul, 0x84); 155e14e0a16SPeter Holm if (res != -1) 156e14e0a16SPeter Holm r[1] = res; 157e14e0a16SPeter Holm *(uint64_t*)0x200003c0 = 0; 158e14e0a16SPeter Holm *(uint32_t*)0x200003c8 = 0; 159e14e0a16SPeter Holm *(uint64_t*)0x200003d0 = 0x20000300; 160e14e0a16SPeter Holm *(uint64_t*)0x20000300 = 0x20000200; 161e14e0a16SPeter Holm memset((void*)0x20000200, 30, 1); 162e14e0a16SPeter Holm *(uint64_t*)0x20000308 = 1; 163e14e0a16SPeter Holm *(uint32_t*)0x200003d8 = 1; 164e14e0a16SPeter Holm *(uint64_t*)0x200003e0 = 0; 165e14e0a16SPeter Holm *(uint32_t*)0x200003e8 = 0; 166e14e0a16SPeter Holm *(uint32_t*)0x200003ec = 0; 167e14e0a16SPeter Holm syscall(SYS_sendmsg, r[0], 0x200003c0ul, 0ul); 168e14e0a16SPeter Holm res = syscall(SYS_dup2, r[0], r[1]); 169e14e0a16SPeter Holm if (res != -1) 170e14e0a16SPeter Holm r[2] = res; 171e14e0a16SPeter Holm *(uint32_t*)0x20000140 = 0; 172e14e0a16SPeter Holm memcpy((void*)0x20000144, "\x0a\x00\x01\x00\x01", 5); 173e14e0a16SPeter Holm syscall(SYS_setsockopt, r[2], 0x84, 0x901, 0x20000140ul, 0xaul); 174e14e0a16SPeter Holm} 175e14e0a16SPeter Holmint main(void) 176e14e0a16SPeter Holm{ 177e14e0a16SPeter Holm syscall(SYS_mmap, 0x20000000ul, 0x1000000ul, 7ul, 0x1012ul, -1, 0ul); 178e14e0a16SPeter Holm for (procid = 0; procid < 4; procid++) { 179e14e0a16SPeter Holm if (fork() == 0) { 180e14e0a16SPeter Holm loop(); 181e14e0a16SPeter Holm } 182e14e0a16SPeter Holm } 183e14e0a16SPeter Holm sleep(1000000); 184e14e0a16SPeter Holm return 0; 185e14e0a16SPeter Holm} 186e14e0a16SPeter HolmEOF 187e14e0a16SPeter Holmmycc -o /tmp/syzkaller55 -Wall -Wextra -O0 /tmp/syzkaller55.c || exit 1 188e14e0a16SPeter Holm 189e14e0a16SPeter Holmkldstat | grep -q sctp || kldload sctp.ko 190e14e0a16SPeter Holmstart=`date +%s` 191e14e0a16SPeter Holmwhile [ $((`date +%s` - start)) -lt 120 ]; do 192e14e0a16SPeter Holm (cd /tmp; timeout 3m ./syzkaller55) 193e14e0a16SPeter Holmdone 194e14e0a16SPeter Holm 195e14e0a16SPeter Holmrm -rf /tmp/syzkaller55 /tmp/syzkaller55.c /tmp/syzkaller55.core \ 196e14e0a16SPeter Holm /tmp/syzkaller.?????? 197e14e0a16SPeter Holmexit 0 198