1*25da2beaSAndroid Build Coastguard Worker /* SPDX-License-Identifier: MIT */
2*25da2beaSAndroid Build Coastguard Worker // https://syzkaller.appspot.com/bug?id=5f5a44abb4cba056fe24255c4fcb7e7bbe13de7a
3*25da2beaSAndroid Build Coastguard Worker // autogenerated by syzkaller (https://github.com/google/syzkaller)
4*25da2beaSAndroid Build Coastguard Worker
5*25da2beaSAndroid Build Coastguard Worker #include <dirent.h>
6*25da2beaSAndroid Build Coastguard Worker #include <endian.h>
7*25da2beaSAndroid Build Coastguard Worker #include <errno.h>
8*25da2beaSAndroid Build Coastguard Worker #include <fcntl.h>
9*25da2beaSAndroid Build Coastguard Worker #include <pthread.h>
10*25da2beaSAndroid Build Coastguard Worker #include <signal.h>
11*25da2beaSAndroid Build Coastguard Worker #include <stdarg.h>
12*25da2beaSAndroid Build Coastguard Worker #include <stdbool.h>
13*25da2beaSAndroid Build Coastguard Worker #include <stdint.h>
14*25da2beaSAndroid Build Coastguard Worker #include <stdio.h>
15*25da2beaSAndroid Build Coastguard Worker #include <stdlib.h>
16*25da2beaSAndroid Build Coastguard Worker #include <string.h>
17*25da2beaSAndroid Build Coastguard Worker #include <sys/mman.h>
18*25da2beaSAndroid Build Coastguard Worker #include <sys/prctl.h>
19*25da2beaSAndroid Build Coastguard Worker #include <sys/stat.h>
20*25da2beaSAndroid Build Coastguard Worker #include <sys/syscall.h>
21*25da2beaSAndroid Build Coastguard Worker #include <sys/types.h>
22*25da2beaSAndroid Build Coastguard Worker #include <sys/wait.h>
23*25da2beaSAndroid Build Coastguard Worker #include <time.h>
24*25da2beaSAndroid Build Coastguard Worker #include <unistd.h>
25*25da2beaSAndroid Build Coastguard Worker
26*25da2beaSAndroid Build Coastguard Worker #include <linux/futex.h>
27*25da2beaSAndroid Build Coastguard Worker
28*25da2beaSAndroid Build Coastguard Worker #ifdef __NR_futex
29*25da2beaSAndroid Build Coastguard Worker
sleep_ms(uint64_t ms)30*25da2beaSAndroid Build Coastguard Worker static void sleep_ms(uint64_t ms)
31*25da2beaSAndroid Build Coastguard Worker {
32*25da2beaSAndroid Build Coastguard Worker usleep(ms * 1000);
33*25da2beaSAndroid Build Coastguard Worker }
34*25da2beaSAndroid Build Coastguard Worker
current_time_ms(void)35*25da2beaSAndroid Build Coastguard Worker static uint64_t current_time_ms(void)
36*25da2beaSAndroid Build Coastguard Worker {
37*25da2beaSAndroid Build Coastguard Worker struct timespec ts;
38*25da2beaSAndroid Build Coastguard Worker if (clock_gettime(CLOCK_MONOTONIC, &ts))
39*25da2beaSAndroid Build Coastguard Worker exit(1);
40*25da2beaSAndroid Build Coastguard Worker return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
41*25da2beaSAndroid Build Coastguard Worker }
42*25da2beaSAndroid Build Coastguard Worker
thread_start(void * (* fn)(void *),void * arg)43*25da2beaSAndroid Build Coastguard Worker static void thread_start(void* (*fn)(void*), void* arg)
44*25da2beaSAndroid Build Coastguard Worker {
45*25da2beaSAndroid Build Coastguard Worker pthread_t th;
46*25da2beaSAndroid Build Coastguard Worker pthread_attr_t attr;
47*25da2beaSAndroid Build Coastguard Worker pthread_attr_init(&attr);
48*25da2beaSAndroid Build Coastguard Worker pthread_attr_setstacksize(&attr, 128 << 10);
49*25da2beaSAndroid Build Coastguard Worker int i = 0;
50*25da2beaSAndroid Build Coastguard Worker for (; i < 100; i++) {
51*25da2beaSAndroid Build Coastguard Worker if (pthread_create(&th, &attr, fn, arg) == 0) {
52*25da2beaSAndroid Build Coastguard Worker pthread_attr_destroy(&attr);
53*25da2beaSAndroid Build Coastguard Worker return;
54*25da2beaSAndroid Build Coastguard Worker }
55*25da2beaSAndroid Build Coastguard Worker if (errno == EAGAIN) {
56*25da2beaSAndroid Build Coastguard Worker usleep(50);
57*25da2beaSAndroid Build Coastguard Worker continue;
58*25da2beaSAndroid Build Coastguard Worker }
59*25da2beaSAndroid Build Coastguard Worker break;
60*25da2beaSAndroid Build Coastguard Worker }
61*25da2beaSAndroid Build Coastguard Worker exit(1);
62*25da2beaSAndroid Build Coastguard Worker }
63*25da2beaSAndroid Build Coastguard Worker
64*25da2beaSAndroid Build Coastguard Worker typedef struct {
65*25da2beaSAndroid Build Coastguard Worker int state;
66*25da2beaSAndroid Build Coastguard Worker } event_t;
67*25da2beaSAndroid Build Coastguard Worker
event_init(event_t * ev)68*25da2beaSAndroid Build Coastguard Worker static void event_init(event_t* ev)
69*25da2beaSAndroid Build Coastguard Worker {
70*25da2beaSAndroid Build Coastguard Worker ev->state = 0;
71*25da2beaSAndroid Build Coastguard Worker }
72*25da2beaSAndroid Build Coastguard Worker
event_reset(event_t * ev)73*25da2beaSAndroid Build Coastguard Worker static void event_reset(event_t* ev)
74*25da2beaSAndroid Build Coastguard Worker {
75*25da2beaSAndroid Build Coastguard Worker ev->state = 0;
76*25da2beaSAndroid Build Coastguard Worker }
77*25da2beaSAndroid Build Coastguard Worker
event_set(event_t * ev)78*25da2beaSAndroid Build Coastguard Worker static void event_set(event_t* ev)
79*25da2beaSAndroid Build Coastguard Worker {
80*25da2beaSAndroid Build Coastguard Worker if (ev->state)
81*25da2beaSAndroid Build Coastguard Worker exit(1);
82*25da2beaSAndroid Build Coastguard Worker __atomic_store_n(&ev->state, 1, __ATOMIC_RELEASE);
83*25da2beaSAndroid Build Coastguard Worker syscall(__NR_futex, &ev->state, FUTEX_WAKE | FUTEX_PRIVATE_FLAG, 1000000);
84*25da2beaSAndroid Build Coastguard Worker }
85*25da2beaSAndroid Build Coastguard Worker
event_wait(event_t * ev)86*25da2beaSAndroid Build Coastguard Worker static void event_wait(event_t* ev)
87*25da2beaSAndroid Build Coastguard Worker {
88*25da2beaSAndroid Build Coastguard Worker while (!__atomic_load_n(&ev->state, __ATOMIC_ACQUIRE))
89*25da2beaSAndroid Build Coastguard Worker syscall(__NR_futex, &ev->state, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, 0, 0);
90*25da2beaSAndroid Build Coastguard Worker }
91*25da2beaSAndroid Build Coastguard Worker
event_isset(event_t * ev)92*25da2beaSAndroid Build Coastguard Worker static int event_isset(event_t* ev)
93*25da2beaSAndroid Build Coastguard Worker {
94*25da2beaSAndroid Build Coastguard Worker return __atomic_load_n(&ev->state, __ATOMIC_ACQUIRE);
95*25da2beaSAndroid Build Coastguard Worker }
96*25da2beaSAndroid Build Coastguard Worker
event_timedwait(event_t * ev,uint64_t timeout)97*25da2beaSAndroid Build Coastguard Worker static int event_timedwait(event_t* ev, uint64_t timeout)
98*25da2beaSAndroid Build Coastguard Worker {
99*25da2beaSAndroid Build Coastguard Worker uint64_t start = current_time_ms();
100*25da2beaSAndroid Build Coastguard Worker uint64_t now = start;
101*25da2beaSAndroid Build Coastguard Worker for (;;) {
102*25da2beaSAndroid Build Coastguard Worker uint64_t remain = timeout - (now - start);
103*25da2beaSAndroid Build Coastguard Worker struct timespec ts;
104*25da2beaSAndroid Build Coastguard Worker ts.tv_sec = remain / 1000;
105*25da2beaSAndroid Build Coastguard Worker ts.tv_nsec = (remain % 1000) * 1000 * 1000;
106*25da2beaSAndroid Build Coastguard Worker syscall(__NR_futex, &ev->state, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, 0, &ts);
107*25da2beaSAndroid Build Coastguard Worker if (__atomic_load_n(&ev->state, __ATOMIC_ACQUIRE))
108*25da2beaSAndroid Build Coastguard Worker return 1;
109*25da2beaSAndroid Build Coastguard Worker now = current_time_ms();
110*25da2beaSAndroid Build Coastguard Worker if (now - start > timeout)
111*25da2beaSAndroid Build Coastguard Worker return 0;
112*25da2beaSAndroid Build Coastguard Worker }
113*25da2beaSAndroid Build Coastguard Worker }
114*25da2beaSAndroid Build Coastguard Worker
115*25da2beaSAndroid Build Coastguard Worker #define SIZEOF_IO_URING_SQE 64
116*25da2beaSAndroid Build Coastguard Worker #define SIZEOF_IO_URING_CQE 16
117*25da2beaSAndroid Build Coastguard Worker #define SQ_HEAD_OFFSET 0
118*25da2beaSAndroid Build Coastguard Worker #define SQ_TAIL_OFFSET 64
119*25da2beaSAndroid Build Coastguard Worker #define SQ_RING_MASK_OFFSET 256
120*25da2beaSAndroid Build Coastguard Worker #define SQ_RING_ENTRIES_OFFSET 264
121*25da2beaSAndroid Build Coastguard Worker #define SQ_FLAGS_OFFSET 276
122*25da2beaSAndroid Build Coastguard Worker #define SQ_DROPPED_OFFSET 272
123*25da2beaSAndroid Build Coastguard Worker #define CQ_HEAD_OFFSET 128
124*25da2beaSAndroid Build Coastguard Worker #define CQ_TAIL_OFFSET 192
125*25da2beaSAndroid Build Coastguard Worker #define CQ_RING_MASK_OFFSET 260
126*25da2beaSAndroid Build Coastguard Worker #define CQ_RING_ENTRIES_OFFSET 268
127*25da2beaSAndroid Build Coastguard Worker #define CQ_RING_OVERFLOW_OFFSET 284
128*25da2beaSAndroid Build Coastguard Worker #define CQ_FLAGS_OFFSET 280
129*25da2beaSAndroid Build Coastguard Worker #define CQ_CQES_OFFSET 320
130*25da2beaSAndroid Build Coastguard Worker
131*25da2beaSAndroid Build Coastguard Worker struct io_sqring_offsets {
132*25da2beaSAndroid Build Coastguard Worker uint32_t head;
133*25da2beaSAndroid Build Coastguard Worker uint32_t tail;
134*25da2beaSAndroid Build Coastguard Worker uint32_t ring_mask;
135*25da2beaSAndroid Build Coastguard Worker uint32_t ring_entries;
136*25da2beaSAndroid Build Coastguard Worker uint32_t flags;
137*25da2beaSAndroid Build Coastguard Worker uint32_t dropped;
138*25da2beaSAndroid Build Coastguard Worker uint32_t array;
139*25da2beaSAndroid Build Coastguard Worker uint32_t resv1;
140*25da2beaSAndroid Build Coastguard Worker uint64_t resv2;
141*25da2beaSAndroid Build Coastguard Worker };
142*25da2beaSAndroid Build Coastguard Worker
143*25da2beaSAndroid Build Coastguard Worker struct io_cqring_offsets {
144*25da2beaSAndroid Build Coastguard Worker uint32_t head;
145*25da2beaSAndroid Build Coastguard Worker uint32_t tail;
146*25da2beaSAndroid Build Coastguard Worker uint32_t ring_mask;
147*25da2beaSAndroid Build Coastguard Worker uint32_t ring_entries;
148*25da2beaSAndroid Build Coastguard Worker uint32_t overflow;
149*25da2beaSAndroid Build Coastguard Worker uint32_t cqes;
150*25da2beaSAndroid Build Coastguard Worker uint64_t resv[2];
151*25da2beaSAndroid Build Coastguard Worker };
152*25da2beaSAndroid Build Coastguard Worker
153*25da2beaSAndroid Build Coastguard Worker struct io_uring_params {
154*25da2beaSAndroid Build Coastguard Worker uint32_t sq_entries;
155*25da2beaSAndroid Build Coastguard Worker uint32_t cq_entries;
156*25da2beaSAndroid Build Coastguard Worker uint32_t flags;
157*25da2beaSAndroid Build Coastguard Worker uint32_t sq_thread_cpu;
158*25da2beaSAndroid Build Coastguard Worker uint32_t sq_thread_idle;
159*25da2beaSAndroid Build Coastguard Worker uint32_t features;
160*25da2beaSAndroid Build Coastguard Worker uint32_t resv[4];
161*25da2beaSAndroid Build Coastguard Worker struct io_sqring_offsets sq_off;
162*25da2beaSAndroid Build Coastguard Worker struct io_cqring_offsets cq_off;
163*25da2beaSAndroid Build Coastguard Worker };
164*25da2beaSAndroid Build Coastguard Worker
165*25da2beaSAndroid Build Coastguard Worker #define IORING_OFF_SQ_RING 0
166*25da2beaSAndroid Build Coastguard Worker #define IORING_OFF_SQES 0x10000000ULL
167*25da2beaSAndroid Build Coastguard Worker
168*25da2beaSAndroid Build Coastguard Worker #define sys_io_uring_setup 425
syz_io_uring_setup(volatile long a0,volatile long a1,volatile long a2,volatile long a3,volatile long a4,volatile long a5)169*25da2beaSAndroid Build Coastguard Worker static long syz_io_uring_setup(volatile long a0, volatile long a1,
170*25da2beaSAndroid Build Coastguard Worker volatile long a2, volatile long a3,
171*25da2beaSAndroid Build Coastguard Worker volatile long a4, volatile long a5)
172*25da2beaSAndroid Build Coastguard Worker {
173*25da2beaSAndroid Build Coastguard Worker uint32_t entries = (uint32_t)a0;
174*25da2beaSAndroid Build Coastguard Worker struct io_uring_params* setup_params = (struct io_uring_params*)a1;
175*25da2beaSAndroid Build Coastguard Worker void* vma1 = (void*)a2;
176*25da2beaSAndroid Build Coastguard Worker void* vma2 = (void*)a3;
177*25da2beaSAndroid Build Coastguard Worker void** ring_ptr_out = (void**)a4;
178*25da2beaSAndroid Build Coastguard Worker void** sqes_ptr_out = (void**)a5;
179*25da2beaSAndroid Build Coastguard Worker uint32_t fd_io_uring = syscall(sys_io_uring_setup, entries, setup_params);
180*25da2beaSAndroid Build Coastguard Worker uint32_t sq_ring_sz =
181*25da2beaSAndroid Build Coastguard Worker setup_params->sq_off.array + setup_params->sq_entries * sizeof(uint32_t);
182*25da2beaSAndroid Build Coastguard Worker uint32_t cq_ring_sz = setup_params->cq_off.cqes +
183*25da2beaSAndroid Build Coastguard Worker setup_params->cq_entries * SIZEOF_IO_URING_CQE;
184*25da2beaSAndroid Build Coastguard Worker uint32_t ring_sz = sq_ring_sz > cq_ring_sz ? sq_ring_sz : cq_ring_sz;
185*25da2beaSAndroid Build Coastguard Worker *ring_ptr_out = mmap(vma1, ring_sz, PROT_READ | PROT_WRITE,
186*25da2beaSAndroid Build Coastguard Worker MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring,
187*25da2beaSAndroid Build Coastguard Worker IORING_OFF_SQ_RING);
188*25da2beaSAndroid Build Coastguard Worker uint32_t sqes_sz = setup_params->sq_entries * SIZEOF_IO_URING_SQE;
189*25da2beaSAndroid Build Coastguard Worker *sqes_ptr_out =
190*25da2beaSAndroid Build Coastguard Worker mmap(vma2, sqes_sz, PROT_READ | PROT_WRITE,
191*25da2beaSAndroid Build Coastguard Worker MAP_SHARED | MAP_POPULATE | MAP_FIXED, fd_io_uring, IORING_OFF_SQES);
192*25da2beaSAndroid Build Coastguard Worker return fd_io_uring;
193*25da2beaSAndroid Build Coastguard Worker }
194*25da2beaSAndroid Build Coastguard Worker
syz_io_uring_submit(volatile long a0,volatile long a1,volatile long a2,volatile long a3)195*25da2beaSAndroid Build Coastguard Worker static long syz_io_uring_submit(volatile long a0, volatile long a1,
196*25da2beaSAndroid Build Coastguard Worker volatile long a2, volatile long a3)
197*25da2beaSAndroid Build Coastguard Worker {
198*25da2beaSAndroid Build Coastguard Worker char* ring_ptr = (char*)a0;
199*25da2beaSAndroid Build Coastguard Worker char* sqes_ptr = (char*)a1;
200*25da2beaSAndroid Build Coastguard Worker char* sqe = (char*)a2;
201*25da2beaSAndroid Build Coastguard Worker uint32_t sqes_index = (uint32_t)a3;
202*25da2beaSAndroid Build Coastguard Worker uint32_t sq_ring_entries = *(uint32_t*)(ring_ptr + SQ_RING_ENTRIES_OFFSET);
203*25da2beaSAndroid Build Coastguard Worker uint32_t cq_ring_entries = *(uint32_t*)(ring_ptr + CQ_RING_ENTRIES_OFFSET);
204*25da2beaSAndroid Build Coastguard Worker uint32_t sq_array_off =
205*25da2beaSAndroid Build Coastguard Worker (CQ_CQES_OFFSET + cq_ring_entries * SIZEOF_IO_URING_CQE + 63) & ~63;
206*25da2beaSAndroid Build Coastguard Worker if (sq_ring_entries)
207*25da2beaSAndroid Build Coastguard Worker sqes_index %= sq_ring_entries;
208*25da2beaSAndroid Build Coastguard Worker char* sqe_dest = sqes_ptr + sqes_index * SIZEOF_IO_URING_SQE;
209*25da2beaSAndroid Build Coastguard Worker memcpy(sqe_dest, sqe, SIZEOF_IO_URING_SQE);
210*25da2beaSAndroid Build Coastguard Worker uint32_t sq_ring_mask = *(uint32_t*)(ring_ptr + SQ_RING_MASK_OFFSET);
211*25da2beaSAndroid Build Coastguard Worker uint32_t* sq_tail_ptr = (uint32_t*)(ring_ptr + SQ_TAIL_OFFSET);
212*25da2beaSAndroid Build Coastguard Worker uint32_t sq_tail = *sq_tail_ptr & sq_ring_mask;
213*25da2beaSAndroid Build Coastguard Worker uint32_t sq_tail_next = *sq_tail_ptr + 1;
214*25da2beaSAndroid Build Coastguard Worker uint32_t* sq_array = (uint32_t*)(ring_ptr + sq_array_off);
215*25da2beaSAndroid Build Coastguard Worker *(sq_array + sq_tail) = sqes_index;
216*25da2beaSAndroid Build Coastguard Worker __atomic_store_n(sq_tail_ptr, sq_tail_next, __ATOMIC_RELEASE);
217*25da2beaSAndroid Build Coastguard Worker return 0;
218*25da2beaSAndroid Build Coastguard Worker }
219*25da2beaSAndroid Build Coastguard Worker
kill_and_wait(int pid,int * status)220*25da2beaSAndroid Build Coastguard Worker static void kill_and_wait(int pid, int* status)
221*25da2beaSAndroid Build Coastguard Worker {
222*25da2beaSAndroid Build Coastguard Worker kill(-pid, SIGKILL);
223*25da2beaSAndroid Build Coastguard Worker kill(pid, SIGKILL);
224*25da2beaSAndroid Build Coastguard Worker for (int i = 0; i < 100; i++) {
225*25da2beaSAndroid Build Coastguard Worker if (waitpid(-1, status, WNOHANG | __WALL) == pid)
226*25da2beaSAndroid Build Coastguard Worker return;
227*25da2beaSAndroid Build Coastguard Worker usleep(1000);
228*25da2beaSAndroid Build Coastguard Worker }
229*25da2beaSAndroid Build Coastguard Worker DIR* dir = opendir("/sys/fs/fuse/connections");
230*25da2beaSAndroid Build Coastguard Worker if (dir) {
231*25da2beaSAndroid Build Coastguard Worker for (;;) {
232*25da2beaSAndroid Build Coastguard Worker struct dirent* ent = readdir(dir);
233*25da2beaSAndroid Build Coastguard Worker if (!ent)
234*25da2beaSAndroid Build Coastguard Worker break;
235*25da2beaSAndroid Build Coastguard Worker if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
236*25da2beaSAndroid Build Coastguard Worker continue;
237*25da2beaSAndroid Build Coastguard Worker char abort[300];
238*25da2beaSAndroid Build Coastguard Worker snprintf(abort, sizeof(abort), "/sys/fs/fuse/connections/%s/abort",
239*25da2beaSAndroid Build Coastguard Worker ent->d_name);
240*25da2beaSAndroid Build Coastguard Worker int fd = open(abort, O_WRONLY);
241*25da2beaSAndroid Build Coastguard Worker if (fd == -1) {
242*25da2beaSAndroid Build Coastguard Worker continue;
243*25da2beaSAndroid Build Coastguard Worker }
244*25da2beaSAndroid Build Coastguard Worker if (write(fd, abort, 1) < 0) {
245*25da2beaSAndroid Build Coastguard Worker }
246*25da2beaSAndroid Build Coastguard Worker close(fd);
247*25da2beaSAndroid Build Coastguard Worker }
248*25da2beaSAndroid Build Coastguard Worker closedir(dir);
249*25da2beaSAndroid Build Coastguard Worker } else {
250*25da2beaSAndroid Build Coastguard Worker }
251*25da2beaSAndroid Build Coastguard Worker while (waitpid(-1, status, __WALL) != pid) {
252*25da2beaSAndroid Build Coastguard Worker }
253*25da2beaSAndroid Build Coastguard Worker }
254*25da2beaSAndroid Build Coastguard Worker
setup_test()255*25da2beaSAndroid Build Coastguard Worker static void setup_test()
256*25da2beaSAndroid Build Coastguard Worker {
257*25da2beaSAndroid Build Coastguard Worker prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
258*25da2beaSAndroid Build Coastguard Worker setpgrp();
259*25da2beaSAndroid Build Coastguard Worker }
260*25da2beaSAndroid Build Coastguard Worker
261*25da2beaSAndroid Build Coastguard Worker struct thread_t {
262*25da2beaSAndroid Build Coastguard Worker int created, call;
263*25da2beaSAndroid Build Coastguard Worker event_t ready, done;
264*25da2beaSAndroid Build Coastguard Worker };
265*25da2beaSAndroid Build Coastguard Worker
266*25da2beaSAndroid Build Coastguard Worker static struct thread_t threads[16];
267*25da2beaSAndroid Build Coastguard Worker static void execute_call(int call);
268*25da2beaSAndroid Build Coastguard Worker static int running;
269*25da2beaSAndroid Build Coastguard Worker
thr(void * arg)270*25da2beaSAndroid Build Coastguard Worker static void* thr(void* arg)
271*25da2beaSAndroid Build Coastguard Worker {
272*25da2beaSAndroid Build Coastguard Worker struct thread_t* th = (struct thread_t*)arg;
273*25da2beaSAndroid Build Coastguard Worker for (;;) {
274*25da2beaSAndroid Build Coastguard Worker event_wait(&th->ready);
275*25da2beaSAndroid Build Coastguard Worker event_reset(&th->ready);
276*25da2beaSAndroid Build Coastguard Worker execute_call(th->call);
277*25da2beaSAndroid Build Coastguard Worker __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED);
278*25da2beaSAndroid Build Coastguard Worker event_set(&th->done);
279*25da2beaSAndroid Build Coastguard Worker }
280*25da2beaSAndroid Build Coastguard Worker return 0;
281*25da2beaSAndroid Build Coastguard Worker }
282*25da2beaSAndroid Build Coastguard Worker
execute_one(void)283*25da2beaSAndroid Build Coastguard Worker static void execute_one(void)
284*25da2beaSAndroid Build Coastguard Worker {
285*25da2beaSAndroid Build Coastguard Worker int i, call, thread;
286*25da2beaSAndroid Build Coastguard Worker for (call = 0; call < 4; call++) {
287*25da2beaSAndroid Build Coastguard Worker for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0]));
288*25da2beaSAndroid Build Coastguard Worker thread++) {
289*25da2beaSAndroid Build Coastguard Worker struct thread_t* th = &threads[thread];
290*25da2beaSAndroid Build Coastguard Worker if (!th->created) {
291*25da2beaSAndroid Build Coastguard Worker th->created = 1;
292*25da2beaSAndroid Build Coastguard Worker event_init(&th->ready);
293*25da2beaSAndroid Build Coastguard Worker event_init(&th->done);
294*25da2beaSAndroid Build Coastguard Worker event_set(&th->done);
295*25da2beaSAndroid Build Coastguard Worker thread_start(thr, th);
296*25da2beaSAndroid Build Coastguard Worker }
297*25da2beaSAndroid Build Coastguard Worker if (!event_isset(&th->done))
298*25da2beaSAndroid Build Coastguard Worker continue;
299*25da2beaSAndroid Build Coastguard Worker event_reset(&th->done);
300*25da2beaSAndroid Build Coastguard Worker th->call = call;
301*25da2beaSAndroid Build Coastguard Worker __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED);
302*25da2beaSAndroid Build Coastguard Worker event_set(&th->ready);
303*25da2beaSAndroid Build Coastguard Worker event_timedwait(&th->done, 50);
304*25da2beaSAndroid Build Coastguard Worker break;
305*25da2beaSAndroid Build Coastguard Worker }
306*25da2beaSAndroid Build Coastguard Worker }
307*25da2beaSAndroid Build Coastguard Worker for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++)
308*25da2beaSAndroid Build Coastguard Worker sleep_ms(1);
309*25da2beaSAndroid Build Coastguard Worker }
310*25da2beaSAndroid Build Coastguard Worker
311*25da2beaSAndroid Build Coastguard Worker static void execute_one(void);
312*25da2beaSAndroid Build Coastguard Worker
313*25da2beaSAndroid Build Coastguard Worker #define WAIT_FLAGS __WALL
314*25da2beaSAndroid Build Coastguard Worker
loop(void)315*25da2beaSAndroid Build Coastguard Worker static void loop(void)
316*25da2beaSAndroid Build Coastguard Worker {
317*25da2beaSAndroid Build Coastguard Worker int iter = 0;
318*25da2beaSAndroid Build Coastguard Worker for (; iter < 5000; iter++) {
319*25da2beaSAndroid Build Coastguard Worker int pid = fork();
320*25da2beaSAndroid Build Coastguard Worker if (pid < 0)
321*25da2beaSAndroid Build Coastguard Worker exit(1);
322*25da2beaSAndroid Build Coastguard Worker if (pid == 0) {
323*25da2beaSAndroid Build Coastguard Worker setup_test();
324*25da2beaSAndroid Build Coastguard Worker execute_one();
325*25da2beaSAndroid Build Coastguard Worker exit(0);
326*25da2beaSAndroid Build Coastguard Worker }
327*25da2beaSAndroid Build Coastguard Worker int status = 0;
328*25da2beaSAndroid Build Coastguard Worker uint64_t start = current_time_ms();
329*25da2beaSAndroid Build Coastguard Worker for (;;) {
330*25da2beaSAndroid Build Coastguard Worker if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
331*25da2beaSAndroid Build Coastguard Worker break;
332*25da2beaSAndroid Build Coastguard Worker sleep_ms(1);
333*25da2beaSAndroid Build Coastguard Worker if (current_time_ms() - start < 5000)
334*25da2beaSAndroid Build Coastguard Worker continue;
335*25da2beaSAndroid Build Coastguard Worker kill_and_wait(pid, &status);
336*25da2beaSAndroid Build Coastguard Worker break;
337*25da2beaSAndroid Build Coastguard Worker }
338*25da2beaSAndroid Build Coastguard Worker }
339*25da2beaSAndroid Build Coastguard Worker }
340*25da2beaSAndroid Build Coastguard Worker
341*25da2beaSAndroid Build Coastguard Worker #ifndef __NR_io_uring_enter
342*25da2beaSAndroid Build Coastguard Worker #define __NR_io_uring_enter 426
343*25da2beaSAndroid Build Coastguard Worker #endif
344*25da2beaSAndroid Build Coastguard Worker
345*25da2beaSAndroid Build Coastguard Worker uint64_t r[4] = {0xffffffffffffffff, 0xffffffffffffffff, 0x0, 0x0};
346*25da2beaSAndroid Build Coastguard Worker
execute_call(int call)347*25da2beaSAndroid Build Coastguard Worker void execute_call(int call)
348*25da2beaSAndroid Build Coastguard Worker {
349*25da2beaSAndroid Build Coastguard Worker intptr_t res = 0;
350*25da2beaSAndroid Build Coastguard Worker switch (call) {
351*25da2beaSAndroid Build Coastguard Worker case 0:
352*25da2beaSAndroid Build Coastguard Worker *(uint64_t*)0x200000c0 = 0;
353*25da2beaSAndroid Build Coastguard Worker res = syscall(__NR_signalfd4, -1, 0x200000c0ul, 8ul, 0ul);
354*25da2beaSAndroid Build Coastguard Worker if (res != -1)
355*25da2beaSAndroid Build Coastguard Worker r[0] = res;
356*25da2beaSAndroid Build Coastguard Worker break;
357*25da2beaSAndroid Build Coastguard Worker case 1:
358*25da2beaSAndroid Build Coastguard Worker *(uint32_t*)0x20000a84 = 0;
359*25da2beaSAndroid Build Coastguard Worker *(uint32_t*)0x20000a88 = 0;
360*25da2beaSAndroid Build Coastguard Worker *(uint32_t*)0x20000a8c = 0;
361*25da2beaSAndroid Build Coastguard Worker *(uint32_t*)0x20000a90 = 0;
362*25da2beaSAndroid Build Coastguard Worker *(uint32_t*)0x20000a98 = -1;
363*25da2beaSAndroid Build Coastguard Worker memset((void*)0x20000a9c, 0, 12);
364*25da2beaSAndroid Build Coastguard Worker res = -1;
365*25da2beaSAndroid Build Coastguard Worker res = syz_io_uring_setup(0x87, 0x20000a80, 0x206d6000, 0x206d7000,
366*25da2beaSAndroid Build Coastguard Worker 0x20000000, 0x20000040);
367*25da2beaSAndroid Build Coastguard Worker if (res != -1) {
368*25da2beaSAndroid Build Coastguard Worker r[1] = res;
369*25da2beaSAndroid Build Coastguard Worker r[2] = *(uint64_t*)0x20000000;
370*25da2beaSAndroid Build Coastguard Worker r[3] = *(uint64_t*)0x20000040;
371*25da2beaSAndroid Build Coastguard Worker }
372*25da2beaSAndroid Build Coastguard Worker break;
373*25da2beaSAndroid Build Coastguard Worker case 2:
374*25da2beaSAndroid Build Coastguard Worker *(uint8_t*)0x20002240 = 6;
375*25da2beaSAndroid Build Coastguard Worker *(uint8_t*)0x20002241 = 0;
376*25da2beaSAndroid Build Coastguard Worker *(uint16_t*)0x20002242 = 0;
377*25da2beaSAndroid Build Coastguard Worker *(uint32_t*)0x20002244 = r[0];
378*25da2beaSAndroid Build Coastguard Worker *(uint64_t*)0x20002248 = 0;
379*25da2beaSAndroid Build Coastguard Worker *(uint64_t*)0x20002250 = 0;
380*25da2beaSAndroid Build Coastguard Worker *(uint32_t*)0x20002258 = 0;
381*25da2beaSAndroid Build Coastguard Worker *(uint16_t*)0x2000225c = 0;
382*25da2beaSAndroid Build Coastguard Worker *(uint16_t*)0x2000225e = 0;
383*25da2beaSAndroid Build Coastguard Worker *(uint64_t*)0x20002260 = 0;
384*25da2beaSAndroid Build Coastguard Worker *(uint16_t*)0x20002268 = 0;
385*25da2beaSAndroid Build Coastguard Worker *(uint16_t*)0x2000226a = 0;
386*25da2beaSAndroid Build Coastguard Worker memset((void*)0x2000226c, 0, 20);
387*25da2beaSAndroid Build Coastguard Worker syz_io_uring_submit(r[2], r[3], 0x20002240, 0);
388*25da2beaSAndroid Build Coastguard Worker break;
389*25da2beaSAndroid Build Coastguard Worker case 3:
390*25da2beaSAndroid Build Coastguard Worker syscall(__NR_io_uring_enter, r[1], 0x1523a, 0, 0ul, 0ul, 0xaul);
391*25da2beaSAndroid Build Coastguard Worker break;
392*25da2beaSAndroid Build Coastguard Worker }
393*25da2beaSAndroid Build Coastguard Worker }
394*25da2beaSAndroid Build Coastguard Worker
main(int argc,char * argv[])395*25da2beaSAndroid Build Coastguard Worker int main(int argc, char *argv[])
396*25da2beaSAndroid Build Coastguard Worker {
397*25da2beaSAndroid Build Coastguard Worker void *ret;
398*25da2beaSAndroid Build Coastguard Worker
399*25da2beaSAndroid Build Coastguard Worker #if !defined(__i386) && !defined(__x86_64__)
400*25da2beaSAndroid Build Coastguard Worker return 0;
401*25da2beaSAndroid Build Coastguard Worker #endif
402*25da2beaSAndroid Build Coastguard Worker
403*25da2beaSAndroid Build Coastguard Worker if (argc > 1)
404*25da2beaSAndroid Build Coastguard Worker return 0;
405*25da2beaSAndroid Build Coastguard Worker
406*25da2beaSAndroid Build Coastguard Worker ret = mmap((void *)0x1ffff000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul);
407*25da2beaSAndroid Build Coastguard Worker if (ret == MAP_FAILED)
408*25da2beaSAndroid Build Coastguard Worker return 0;
409*25da2beaSAndroid Build Coastguard Worker ret = mmap((void *)0x20000000ul, 0x1000000ul, 7ul, 0x32ul, -1, 0ul);
410*25da2beaSAndroid Build Coastguard Worker if (ret == MAP_FAILED)
411*25da2beaSAndroid Build Coastguard Worker return 0;
412*25da2beaSAndroid Build Coastguard Worker ret = mmap((void *)0x21000000ul, 0x1000ul, 0ul, 0x32ul, -1, 0ul);
413*25da2beaSAndroid Build Coastguard Worker if (ret == MAP_FAILED)
414*25da2beaSAndroid Build Coastguard Worker return 0;
415*25da2beaSAndroid Build Coastguard Worker loop();
416*25da2beaSAndroid Build Coastguard Worker return 0;
417*25da2beaSAndroid Build Coastguard Worker }
418*25da2beaSAndroid Build Coastguard Worker
419*25da2beaSAndroid Build Coastguard Worker #else /* __NR_futex */
420*25da2beaSAndroid Build Coastguard Worker
main(int argc,char * argv[])421*25da2beaSAndroid Build Coastguard Worker int main(int argc, char *argv[])
422*25da2beaSAndroid Build Coastguard Worker {
423*25da2beaSAndroid Build Coastguard Worker return 0;
424*25da2beaSAndroid Build Coastguard Worker }
425*25da2beaSAndroid Build Coastguard Worker
426*25da2beaSAndroid Build Coastguard Worker #endif /* __NR_futex */
427