xref: /freebsd/tools/test/stress2/misc/syzkaller55.sh (revision 7f658f99f7ed5d1d0e0802073bb22eb8a0a784fb)
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