xref: /freebsd/tools/test/stress2/misc/syzkaller57.sh (revision e14e0a163225e4363c08c3c954c84447f8a20c03)
1*e14e0a16SPeter Holm#!/bin/sh
2*e14e0a16SPeter Holm
3*e14e0a16SPeter Holm# panic: sbflush_internal: ccc 0 mb 0 mbcnt 256
4*e14e0a16SPeter Holm# cpuid = 6
5*e14e0a16SPeter Holm# time = 1653879149
6*e14e0a16SPeter Holm# KDB: stack backtrace:
7*e14e0a16SPeter Holm# db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe0694766c00
8*e14e0a16SPeter Holm# vpanic() at vpanic+0x17f/frame 0xfffffe0694766c50
9*e14e0a16SPeter Holm# panic() at panic+0x43/frame 0xfffffe0694766cb0
10*e14e0a16SPeter Holm# sbrelease_internal() at sbrelease_internal+0xb9/frame 0xfffffe0694766cd0
11*e14e0a16SPeter Holm# solisten_proto() at solisten_proto+0xb5/frame 0xfffffe0694766d30
12*e14e0a16SPeter Holm# sctp_listen() at sctp_listen+0x2f7/frame 0xfffffe0694766da0
13*e14e0a16SPeter Holm# solisten() at solisten+0x42/frame 0xfffffe0694766dc0
14*e14e0a16SPeter Holm# kern_listen() at kern_listen+0x7d/frame 0xfffffe0694766e00
15*e14e0a16SPeter Holm# amd64_syscall() at amd64_syscall+0x145/frame 0xfffffe0694766f30
16*e14e0a16SPeter Holm# fast_syscall_common() at fast_syscall_common+0xf8/frame 0xfffffe0694766f30
17*e14e0a16SPeter Holm# --- syscall (0, FreeBSD ELF64, nosys), rip = 0x82222e7da, rsp = 0x820d68d88, rbp = 0x820d68f00 ---
18*e14e0a16SPeter Holm# KDB: enter: panic
19*e14e0a16SPeter Holm# [ thread pid 12921 tid 741095 ]
20*e14e0a16SPeter Holm# Stopped at      kdb_enter+0x32: movq    $0,0x1277ff3(%rip)
21*e14e0a16SPeter Holm# db> x/s version
22*e14e0a16SPeter Holm# FreeBSD 14.0-CURRENT #0 main-n255847-d46174cd8838b: Sat May 28 20:56:08 CEST 2022
23*e14e0a16SPeter Holm# pho@mercat1.netperf.freebsd.org:/usr/src/sys/amd64/compile/PHO
24*e14e0a16SPeter Holm# db>
25*e14e0a16SPeter Holm
26*e14e0a16SPeter Holm[ `uname -p` != "amd64" ] && exit 0
27*e14e0a16SPeter Holm
28*e14e0a16SPeter Holm. ../default.cfg
29*e14e0a16SPeter Holmcat > /tmp/syzkaller57.c <<EOF
30*e14e0a16SPeter Holm// https://syzkaller.appspot.com/bug?id=66d47f23f24ecf5536fd47d81defdb917c307bd2
31*e14e0a16SPeter Holm// autogenerated by syzkaller (https://github.com/google/syzkaller)
32*e14e0a16SPeter Holm// Reported-by: syzbot+6c484f116b9dc88f7db1@syzkaller.appspotmail.com
33*e14e0a16SPeter Holm
34*e14e0a16SPeter Holm#define _GNU_SOURCE
35*e14e0a16SPeter Holm
36*e14e0a16SPeter Holm#include <sys/types.h>
37*e14e0a16SPeter Holm
38*e14e0a16SPeter Holm#include <dirent.h>
39*e14e0a16SPeter Holm#include <errno.h>
40*e14e0a16SPeter Holm#include <pwd.h>
41*e14e0a16SPeter Holm#include <setjmp.h>
42*e14e0a16SPeter Holm#include <signal.h>
43*e14e0a16SPeter Holm#include <stdarg.h>
44*e14e0a16SPeter Holm#include <stdbool.h>
45*e14e0a16SPeter Holm#include <stdint.h>
46*e14e0a16SPeter Holm#include <stdio.h>
47*e14e0a16SPeter Holm#include <stdlib.h>
48*e14e0a16SPeter Holm#include <string.h>
49*e14e0a16SPeter Holm#include <sys/endian.h>
50*e14e0a16SPeter Holm#include <sys/stat.h>
51*e14e0a16SPeter Holm#include <sys/syscall.h>
52*e14e0a16SPeter Holm#include <sys/wait.h>
53*e14e0a16SPeter Holm#include <time.h>
54*e14e0a16SPeter Holm#include <unistd.h>
55*e14e0a16SPeter Holm
56*e14e0a16SPeter Holmstatic __thread int skip_segv;
57*e14e0a16SPeter Holmstatic __thread jmp_buf segv_env;
58*e14e0a16SPeter Holm
59*e14e0a16SPeter Holmstatic void segv_handler(int sig, siginfo_t* info, void* ctx __unused)
60*e14e0a16SPeter Holm{
61*e14e0a16SPeter Holm  uintptr_t addr = (uintptr_t)info->si_addr;
62*e14e0a16SPeter Holm  const uintptr_t prog_start = 1 << 20;
63*e14e0a16SPeter Holm  const uintptr_t prog_end = 100 << 20;
64*e14e0a16SPeter Holm  int skip = __atomic_load_n(&skip_segv, __ATOMIC_RELAXED) != 0;
65*e14e0a16SPeter Holm  int valid = addr < prog_start || addr > prog_end;
66*e14e0a16SPeter Holm  if (sig == SIGBUS) {
67*e14e0a16SPeter Holm    valid = 1;
68*e14e0a16SPeter Holm  }
69*e14e0a16SPeter Holm  if (skip && valid) {
70*e14e0a16SPeter Holm    _longjmp(segv_env, 1);
71*e14e0a16SPeter Holm  }
72*e14e0a16SPeter Holm  exit(sig);
73*e14e0a16SPeter Holm}
74*e14e0a16SPeter Holm
75*e14e0a16SPeter Holmstatic void install_segv_handler(void)
76*e14e0a16SPeter Holm{
77*e14e0a16SPeter Holm  struct sigaction sa;
78*e14e0a16SPeter Holm  memset(&sa, 0, sizeof(sa));
79*e14e0a16SPeter Holm  sa.sa_sigaction = segv_handler;
80*e14e0a16SPeter Holm  sa.sa_flags = SA_NODEFER | SA_SIGINFO;
81*e14e0a16SPeter Holm  sigaction(SIGSEGV, &sa, NULL);
82*e14e0a16SPeter Holm  sigaction(SIGBUS, &sa, NULL);
83*e14e0a16SPeter Holm}
84*e14e0a16SPeter Holm
85*e14e0a16SPeter Holm#define NONFAILING(...)                                                        \
86*e14e0a16SPeter Holm  ({                                                                           \
87*e14e0a16SPeter Holm    int ok = 1;                                                                \
88*e14e0a16SPeter Holm    __atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST);                       \
89*e14e0a16SPeter Holm    if (_setjmp(segv_env) == 0) {                                              \
90*e14e0a16SPeter Holm      __VA_ARGS__;                                                             \
91*e14e0a16SPeter Holm    } else                                                                     \
92*e14e0a16SPeter Holm      ok = 0;                                                                  \
93*e14e0a16SPeter Holm    __atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST);                       \
94*e14e0a16SPeter Holm    ok;                                                                        \
95*e14e0a16SPeter Holm  })
96*e14e0a16SPeter Holm
97*e14e0a16SPeter Holmstatic void kill_and_wait(int pid, int* status)
98*e14e0a16SPeter Holm{
99*e14e0a16SPeter Holm  kill(pid, SIGKILL);
100*e14e0a16SPeter Holm  while (waitpid(-1, status, 0) != pid) {
101*e14e0a16SPeter Holm  }
102*e14e0a16SPeter Holm}
103*e14e0a16SPeter Holm
104*e14e0a16SPeter Holmstatic void sleep_ms(uint64_t ms)
105*e14e0a16SPeter Holm{
106*e14e0a16SPeter Holm  usleep(ms * 1000);
107*e14e0a16SPeter Holm}
108*e14e0a16SPeter Holm
109*e14e0a16SPeter Holmstatic uint64_t current_time_ms(void)
110*e14e0a16SPeter Holm{
111*e14e0a16SPeter Holm  struct timespec ts;
112*e14e0a16SPeter Holm  if (clock_gettime(CLOCK_MONOTONIC, &ts))
113*e14e0a16SPeter Holm    exit(1);
114*e14e0a16SPeter Holm  return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
115*e14e0a16SPeter Holm}
116*e14e0a16SPeter Holm
117*e14e0a16SPeter Holmstatic void use_temporary_dir(void)
118*e14e0a16SPeter Holm{
119*e14e0a16SPeter Holm  char tmpdir_template[] = "./syzkaller.XXXXXX";
120*e14e0a16SPeter Holm  char* tmpdir = mkdtemp(tmpdir_template);
121*e14e0a16SPeter Holm  if (!tmpdir)
122*e14e0a16SPeter Holm    exit(1);
123*e14e0a16SPeter Holm  if (chmod(tmpdir, 0777))
124*e14e0a16SPeter Holm    exit(1);
125*e14e0a16SPeter Holm  if (chdir(tmpdir))
126*e14e0a16SPeter Holm    exit(1);
127*e14e0a16SPeter Holm}
128*e14e0a16SPeter Holm
129*e14e0a16SPeter Holmstatic void __attribute__((noinline)) remove_dir(const char* dir)
130*e14e0a16SPeter Holm{
131*e14e0a16SPeter Holm  DIR* dp = opendir(dir);
132*e14e0a16SPeter Holm  if (dp == NULL) {
133*e14e0a16SPeter Holm    if (errno == EACCES) {
134*e14e0a16SPeter Holm      if (rmdir(dir))
135*e14e0a16SPeter Holm        exit(1);
136*e14e0a16SPeter Holm      return;
137*e14e0a16SPeter Holm    }
138*e14e0a16SPeter Holm    exit(1);
139*e14e0a16SPeter Holm  }
140*e14e0a16SPeter Holm  struct dirent* ep = 0;
141*e14e0a16SPeter Holm  while ((ep = readdir(dp))) {
142*e14e0a16SPeter Holm    if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0)
143*e14e0a16SPeter Holm      continue;
144*e14e0a16SPeter Holm    char filename[FILENAME_MAX];
145*e14e0a16SPeter Holm    snprintf(filename, sizeof(filename), "%s/%s", dir, ep->d_name);
146*e14e0a16SPeter Holm    struct stat st;
147*e14e0a16SPeter Holm    if (lstat(filename, &st))
148*e14e0a16SPeter Holm      exit(1);
149*e14e0a16SPeter Holm    if (S_ISDIR(st.st_mode)) {
150*e14e0a16SPeter Holm      remove_dir(filename);
151*e14e0a16SPeter Holm      continue;
152*e14e0a16SPeter Holm    }
153*e14e0a16SPeter Holm    if (unlink(filename))
154*e14e0a16SPeter Holm      exit(1);
155*e14e0a16SPeter Holm  }
156*e14e0a16SPeter Holm  closedir(dp);
157*e14e0a16SPeter Holm  if (rmdir(dir))
158*e14e0a16SPeter Holm    exit(1);
159*e14e0a16SPeter Holm}
160*e14e0a16SPeter Holm
161*e14e0a16SPeter Holmstatic void execute_one(void);
162*e14e0a16SPeter Holm
163*e14e0a16SPeter Holm#define WAIT_FLAGS 0
164*e14e0a16SPeter Holm
165*e14e0a16SPeter Holmstatic void loop(void)
166*e14e0a16SPeter Holm{
167*e14e0a16SPeter Holm  int iter = 0;
168*e14e0a16SPeter Holm  for (;; iter++) {
169*e14e0a16SPeter Holm    char cwdbuf[32];
170*e14e0a16SPeter Holm    sprintf(cwdbuf, "./%d", iter);
171*e14e0a16SPeter Holm    if (mkdir(cwdbuf, 0777))
172*e14e0a16SPeter Holm      exit(1);
173*e14e0a16SPeter Holm    int pid = fork();
174*e14e0a16SPeter Holm    if (pid < 0)
175*e14e0a16SPeter Holm      exit(1);
176*e14e0a16SPeter Holm    if (pid == 0) {
177*e14e0a16SPeter Holm      if (chdir(cwdbuf))
178*e14e0a16SPeter Holm        exit(1);
179*e14e0a16SPeter Holm      execute_one();
180*e14e0a16SPeter Holm      exit(0);
181*e14e0a16SPeter Holm    }
182*e14e0a16SPeter Holm    int status = 0;
183*e14e0a16SPeter Holm    uint64_t start = current_time_ms();
184*e14e0a16SPeter Holm    for (;;) {
185*e14e0a16SPeter Holm      if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
186*e14e0a16SPeter Holm        break;
187*e14e0a16SPeter Holm      sleep_ms(1);
188*e14e0a16SPeter Holm      if (current_time_ms() - start < 5000) {
189*e14e0a16SPeter Holm        continue;
190*e14e0a16SPeter Holm      }
191*e14e0a16SPeter Holm      kill_and_wait(pid, &status);
192*e14e0a16SPeter Holm      break;
193*e14e0a16SPeter Holm    }
194*e14e0a16SPeter Holm    remove_dir(cwdbuf);
195*e14e0a16SPeter Holm  }
196*e14e0a16SPeter Holm}
197*e14e0a16SPeter Holm
198*e14e0a16SPeter Holmuint64_t r[1] = {0xffffffffffffffff};
199*e14e0a16SPeter Holm
200*e14e0a16SPeter Holmvoid execute_one(void)
201*e14e0a16SPeter Holm{
202*e14e0a16SPeter Holm  intptr_t res = 0;
203*e14e0a16SPeter Holm  res = syscall(SYS_socket, 0x1cul, 1ul, 0x84);
204*e14e0a16SPeter Holm  if (res != -1)
205*e14e0a16SPeter Holm    r[0] = res;
206*e14e0a16SPeter Holm  NONFAILING(*(uint8_t*)0x20000000 = 0x1c);
207*e14e0a16SPeter Holm  NONFAILING(*(uint8_t*)0x20000001 = 0x1c);
208*e14e0a16SPeter Holm  NONFAILING(*(uint16_t*)0x20000002 = htobe16(0x4e22));
209*e14e0a16SPeter Holm  NONFAILING(*(uint32_t*)0x20000004 = 0x20);
210*e14e0a16SPeter Holm  NONFAILING(memset((void*)0x20000008, 0, 16));
211*e14e0a16SPeter Holm  NONFAILING(*(uint32_t*)0x20000018 = 0x20);
212*e14e0a16SPeter Holm  syscall(SYS_bind, r[0], 0x20000000ul, 0x1cul);
213*e14e0a16SPeter Holm  NONFAILING(*(uint8_t*)0x20000180 = 0x1c);
214*e14e0a16SPeter Holm  NONFAILING(*(uint8_t*)0x20000181 = 0x1c);
215*e14e0a16SPeter Holm  NONFAILING(*(uint16_t*)0x20000182 = htobe16(0x4e22));
216*e14e0a16SPeter Holm  NONFAILING(*(uint32_t*)0x20000184 = 4);
217*e14e0a16SPeter Holm  NONFAILING(*(uint64_t*)0x20000188 = htobe64(0));
218*e14e0a16SPeter Holm  NONFAILING(*(uint64_t*)0x20000190 = htobe64(1));
219*e14e0a16SPeter Holm  NONFAILING(*(uint32_t*)0x20000198 = 4);
220*e14e0a16SPeter Holm  syscall(SYS_connect, r[0], 0x20000180ul, 0x1cul);
221*e14e0a16SPeter Holm  NONFAILING(memcpy(
222*e14e0a16SPeter Holm      (void*)0x20000480,
223*e14e0a16SPeter Holm      "\xa3\x1b\xe1\x78\x8e\x58\x9b\x38\x59\xf3\xbb\xdd\x7e\xf7\x51\x23\x97\x31"
224*e14e0a16SPeter Holm      "\xb2\x90\x4a\xd0\x4e\xb7\xdc\x37\xc6\x95\xf6\x05\x5c\xa8\x36\x54\x7e\x7b"
225*e14e0a16SPeter Holm      "\x6c\xc3\x7d\xae\x2a\xe4\x77\x08\x94\x67\x3c\x89\x65\x93\x24\x1c\x56\x3e"
226*e14e0a16SPeter Holm      "\x08\x69\x05\x35\xeb\x3b\x7f\x19\x7d\xda\x44\x54\xb4\x42\x4f\x34\xc8\x81"
227*e14e0a16SPeter Holm      "\x69\x4e\xac\xef\xa6\xd4\xb1\x61\x9d\xf1\x0b\x97\x7c\xd9\x82\x16\xc9\x7b"
228*e14e0a16SPeter Holm      "\x2e\xb3\x9f\x02\xde\x0f\xae\xe7\x0b\xec\xa3\x66\x3c\x2e\x6c\xd1\xca\x02"
229*e14e0a16SPeter Holm      "\xae\x0f\xd5\x65\xb9\x7c\x5c\xa0\xea\xfc\xa4\xc9\x13\x73\x14\x16\xba\xcc"
230*e14e0a16SPeter Holm      "\xae\x89\xe2\x68\x77\xfc\x2a\x8c\xa3\xee\xa8\x45\xf7\xc2\xcb\x48\x93\xe5"
231*e14e0a16SPeter Holm      "\x83\x52\x45\x26\xe3\xeb\x73\xa2\xe4\xf1\x11\xcf\x40\x5f\xef\x99\xc2\xa1"
232*e14e0a16SPeter Holm      "\xeb\x2c\x96\x70\x56\x88\xc8\xc7\x6b\xa1\x66\xd2\x23\x20\x07\x62\x69\xd2"
233*e14e0a16SPeter Holm      "\x1c\x52\xbb\x5e\x86\x43\x7d\x6c\x65\x44\x42\xf6\xd8\x45\xe2\xff\x77\xf9"
234*e14e0a16SPeter Holm      "\x24\xf0\x1d\x29\xf6\xd3\x74\x83\x25\x40\x56\x50\x17\x7f\xc3\x60\xd7\xed"
235*e14e0a16SPeter Holm      "\xb1\xfb\x7a\x74\x38\x2b\x47\x34\x93\x9c\xee\xc9\xb0\xbf\x7d\xc4\x19\xe2"
236*e14e0a16SPeter Holm      "\x77\x49\xbc\x71\x9c\x30\x8b\x57\x0f\x13\x4d\x93\x9d\x53\xa8\x03\xc1\x3b"
237*e14e0a16SPeter Holm      "\x5d\xc3\xbc\x20\xc4\x9e\xc1\x62\x69\xca\x92\x0f\x04\xa1\x0b\xea\xe7\x61"
238*e14e0a16SPeter Holm      "\x79\x99\x5a\x53\x1a\x27\x40\xf0\x0b\xc5\xe8\xb5\xf0\xd8\x1c\xd2\xca\x99"
239*e14e0a16SPeter Holm      "\x16\x70\xa8\xc5\xac\x0a\x6b\x99\x31\x0c\x90\xe2\xa5\xe0\xe3\x7c\x99\x3c"
240*e14e0a16SPeter Holm      "\xbd\xeb\x42\xcf\x74\xe0\xa8\xea\x4e\x64\xd8\x30\x46\x6d\x6e\x83\x7f\x21"
241*e14e0a16SPeter Holm      "\x00\x5c\xcf\x79\xfe\x19\xdd\xd5\xaf\x69\x9e\x1b\x67\xd5\x3f\x18\x4d\xe5"
242*e14e0a16SPeter Holm      "\x2a\xec\x02\x12\x92",
243*e14e0a16SPeter Holm      347));
244*e14e0a16SPeter Holm  syscall(SYS_sendto, r[0], 0x20000480ul, 0x15bul, 0x20108ul, 0ul, 0ul);
245*e14e0a16SPeter Holm  syscall(SYS_listen, r[0], 0x1f);
246*e14e0a16SPeter Holm}
247*e14e0a16SPeter Holmint main(void)
248*e14e0a16SPeter Holm{
249*e14e0a16SPeter Holm  syscall(SYS_mmap, 0x20000000ul, 0x1000000ul, 7ul, 0x1012ul, -1, 0ul);
250*e14e0a16SPeter Holm  install_segv_handler();
251*e14e0a16SPeter Holm  use_temporary_dir();
252*e14e0a16SPeter Holm  loop();
253*e14e0a16SPeter Holm  return 0;
254*e14e0a16SPeter Holm}
255*e14e0a16SPeter HolmEOF
256*e14e0a16SPeter Holmmycc -o /tmp/syzkaller57 -Wall -Wextra -O0 /tmp/syzkaller57.c || exit 1
257*e14e0a16SPeter Holm
258*e14e0a16SPeter Holmkldstat | grep -q sctp || { kldload sctp.ko && loaded=1; }
259*e14e0a16SPeter Holmfor i in `jot 3`; do
260*e14e0a16SPeter Holm	(cd /tmp; timeout 3m ./syzkaller57) &
261*e14e0a16SPeter Holmdone
262*e14e0a16SPeter Holmwait
263*e14e0a16SPeter Holm
264*e14e0a16SPeter Holmrm -rf /tmp/syzkaller57 /tmp/syzkaller57.c /tmp/syzkaller57.core \
265*e14e0a16SPeter Holm    /tmp/syzkaller.??????
266*e14e0a16SPeter Holm[ $loaded ] && kldunload sctp.ko
267*e14e0a16SPeter Holmexit 0
268