1afce5835SPeter Holm#!/bin/sh 2afce5835SPeter Holm 3afce5835SPeter Holm[ `uname -p` != "amd64" ] && exit 0 4afce5835SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 5afce5835SPeter Holm 6afce5835SPeter Holm# panic: Assertion lock == sq->sq_lock failed at ../../../kern/subr_sleepqueue.c:371 7afce5835SPeter Holm# cpuid = 1 8afce5835SPeter Holm# time = 1623487895 9afce5835SPeter Holm# KDB: stack backtrace: 10afce5835SPeter Holm# db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe06c14b4700 11afce5835SPeter Holm# vpanic() at vpanic+0x181/frame 0xfffffe06c14b4750 12afce5835SPeter Holm# panic() at panic+0x43/frame 0xfffffe06c14b47b0 13afce5835SPeter Holm# sleepq_add() at sleepq_add+0x3e6/frame 0xfffffe06c14b4800 14afce5835SPeter Holm# _sleep() at _sleep+0x20e/frame 0xfffffe06c14b48b0 15afce5835SPeter Holm# kern_sigtimedwait() at kern_sigtimedwait+0x532/frame 0xfffffe06c14b4a20 16afce5835SPeter Holm# sys_sigwaitinfo() at sys_sigwaitinfo+0x43/frame 0xfffffe06c14b4ac0 17afce5835SPeter Holm# amd64_syscall() at amd64_syscall+0x147/frame 0xfffffe06c14b4bf0 18afce5835SPeter Holm# fast_syscall_common() at fast_syscall_common+0xf8/frame 0xfffffe06c14b4bf0 19afce5835SPeter Holm# --- syscall (0, FreeBSD ELF64, nosys), rip = 0x8003af5fa, rsp = 0x7fffffffe5f8, rbp = 0x7fffffffe610 --- 20afce5835SPeter Holm# KDB: enter: panic 21afce5835SPeter Holm# [ thread pid 15370 tid 356127 ] 22afce5835SPeter Holm# Stopped at kdb_enter+0x37: movq $0,0x1285b4e(%rip) 23afce5835SPeter Holm# db> x/s version 24afce5835SPeter Holm# version: FreeBSD 14.0-CURRENT #0 main-n247326-2349cda44fea: Sat Jun 12 03:57:33 CEST 2021 25afce5835SPeter Holm# pho@mercat1.netperf.freebsd.org:/usr/src/sys/amd64/compile/PHO 26afce5835SPeter Holm# db> 27afce5835SPeter Holm 28afce5835SPeter Holm. ../default.cfg 29afce5835SPeter Holmcat > /tmp/syzkaller42.c <<EOF 30afce5835SPeter Holm// https://syzkaller.appspot.com/bug?id=b12f0c4dc1e73c25636e4c4d4787209d155cca0a 31afce5835SPeter Holm// autogenerated by syzkaller (https://github.com/google/syzkaller) 32afce5835SPeter Holm// Reported-by: syzbot+1d89fc2a9ef92ef64fa8@syzkaller.appspotmail.com 33afce5835SPeter Holm 34afce5835SPeter Holm#define _GNU_SOURCE 35afce5835SPeter Holm 36afce5835SPeter Holm#include <sys/types.h> 37afce5835SPeter Holm 38afce5835SPeter Holm#include <pwd.h> 39afce5835SPeter Holm#include <signal.h> 40afce5835SPeter Holm#include <stdarg.h> 41afce5835SPeter Holm#include <stdbool.h> 42afce5835SPeter Holm#include <stdint.h> 43afce5835SPeter Holm#include <stdio.h> 44afce5835SPeter Holm#include <stdlib.h> 45afce5835SPeter Holm#include <string.h> 46afce5835SPeter Holm#include <sys/endian.h> 47afce5835SPeter Holm#include <sys/syscall.h> 48afce5835SPeter Holm#include <sys/wait.h> 49afce5835SPeter Holm#include <time.h> 50afce5835SPeter Holm#include <unistd.h> 51afce5835SPeter Holm 52afce5835SPeter Holmstatic void kill_and_wait(int pid, int* status) 53afce5835SPeter Holm{ 54afce5835SPeter Holm kill(pid, SIGKILL); 55afce5835SPeter Holm while (waitpid(-1, status, 0) != pid) { 56afce5835SPeter Holm } 57afce5835SPeter Holm} 58afce5835SPeter Holm 59afce5835SPeter Holmstatic void sleep_ms(uint64_t ms) 60afce5835SPeter Holm{ 61afce5835SPeter Holm usleep(ms * 1000); 62afce5835SPeter Holm} 63afce5835SPeter Holm 64afce5835SPeter Holmstatic uint64_t current_time_ms(void) 65afce5835SPeter Holm{ 66afce5835SPeter Holm struct timespec ts; 67afce5835SPeter Holm if (clock_gettime(CLOCK_MONOTONIC, &ts)) 68afce5835SPeter Holm exit(1); 69afce5835SPeter Holm return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; 70afce5835SPeter Holm} 71afce5835SPeter Holm 72afce5835SPeter Holmstatic void execute_one(void); 73afce5835SPeter Holm 74afce5835SPeter Holm#define WAIT_FLAGS 0 75afce5835SPeter Holm 76afce5835SPeter Holmstatic void loop(void) 77afce5835SPeter Holm{ 78*7f658f99SPeter Holm int iter __unused = 0; 79afce5835SPeter Holm for (;; iter++) { 80afce5835SPeter Holm int pid = fork(); 81afce5835SPeter Holm if (pid < 0) 82afce5835SPeter Holm exit(1); 83afce5835SPeter Holm if (pid == 0) { 84afce5835SPeter Holm execute_one(); 85afce5835SPeter Holm exit(0); 86afce5835SPeter Holm } 87afce5835SPeter Holm int status = 0; 88afce5835SPeter Holm uint64_t start = current_time_ms(); 89afce5835SPeter Holm for (;;) { 90afce5835SPeter Holm if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid) 91afce5835SPeter Holm break; 92afce5835SPeter Holm sleep_ms(1); 93afce5835SPeter Holm if (current_time_ms() - start < 5000) { 94afce5835SPeter Holm continue; 95afce5835SPeter Holm } 96afce5835SPeter Holm kill_and_wait(pid, &status); 97afce5835SPeter Holm break; 98afce5835SPeter Holm } 99afce5835SPeter Holm } 100afce5835SPeter Holm} 101afce5835SPeter Holm 102afce5835SPeter Holmvoid execute_one(void) 103afce5835SPeter Holm{ 104afce5835SPeter Holm syscall(SYS_rfork, 0x14034ul); 105afce5835SPeter Holm *(uint32_t*)0x20000140 = 0x80000002; 106afce5835SPeter Holm *(uint32_t*)0x20000144 = 0xfffffff7; 107afce5835SPeter Holm *(uint32_t*)0x20000148 = 0x41; 108afce5835SPeter Holm *(uint32_t*)0x2000014c = 3; 109afce5835SPeter Holm syscall(SYS_sigwaitinfo, 0x20000140ul, 0ul); 110afce5835SPeter Holm} 111afce5835SPeter Holmint main(void) 112afce5835SPeter Holm{ 113afce5835SPeter Holm syscall(SYS_mmap, 0x20000000ul, 0x1000000ul, 7ul, 0x1012ul, -1, 0ul); 114afce5835SPeter Holm loop(); 115afce5835SPeter Holm return 0; 116afce5835SPeter Holm} 117afce5835SPeter HolmEOF 118afce5835SPeter Holmmycc -o /tmp/syzkaller42 -Wall -Wextra -O0 /tmp/syzkaller42.c -lpthread || 119afce5835SPeter Holm exit 1 120afce5835SPeter Holm 121afce5835SPeter Holm(cd /tmp; timeout 3m ./syzkaller42) 122afce5835SPeter Holm 123014a2b1aSPeter Holmrm -rf /tmp/syzkaller42 /tmp/syzkaller42.c /tmp/syzkaller.* 124afce5835SPeter Holmexit 0 125