1a7d46ad0SPeter Holm#!/bin/sh 2a7d46ad0SPeter Holm 3a7d46ad0SPeter Holm# Fixed by git: 208256579804 - main - O_PATH: disable kqfilter for fifos 4a7d46ad0SPeter Holm# Submitted by markj@ 5a7d46ad0SPeter Holm 6a7d46ad0SPeter Holm[ `uname -p` != "amd64" ] && exit 0 7a7d46ad0SPeter Holm 8a7d46ad0SPeter Holm. ../default.cfg 9a7d46ad0SPeter Holmcat > /tmp/syzkaller34.c <<EOF 10a7d46ad0SPeter Holm// autogenerated by syzkaller (https://github.com/google/syzkaller) 11a7d46ad0SPeter Holm 12a7d46ad0SPeter Holm#define _GNU_SOURCE 13a7d46ad0SPeter Holm 14a7d46ad0SPeter Holm#include <sys/types.h> 15a7d46ad0SPeter Holm 16a7d46ad0SPeter Holm#include <pwd.h> 17a7d46ad0SPeter Holm#include <signal.h> 18a7d46ad0SPeter Holm#include <stdarg.h> 19a7d46ad0SPeter Holm#include <stdbool.h> 20a7d46ad0SPeter Holm#include <stdint.h> 21a7d46ad0SPeter Holm#include <stdio.h> 22a7d46ad0SPeter Holm#include <stdlib.h> 23a7d46ad0SPeter Holm#include <string.h> 24a7d46ad0SPeter Holm#include <sys/endian.h> 25a7d46ad0SPeter Holm#include <sys/syscall.h> 26a7d46ad0SPeter Holm#include <sys/wait.h> 27a7d46ad0SPeter Holm#include <time.h> 28a7d46ad0SPeter Holm#include <unistd.h> 29a7d46ad0SPeter Holm 30a7d46ad0SPeter Holmstatic void kill_and_wait(int pid, int* status) 31a7d46ad0SPeter Holm{ 32a7d46ad0SPeter Holm kill(pid, SIGKILL); 33a7d46ad0SPeter Holm while (waitpid(-1, status, 0) != pid) { 34a7d46ad0SPeter Holm } 35a7d46ad0SPeter Holm} 36a7d46ad0SPeter Holm 37a7d46ad0SPeter Holmstatic void sleep_ms(uint64_t ms) 38a7d46ad0SPeter Holm{ 39a7d46ad0SPeter Holm usleep(ms * 1000); 40a7d46ad0SPeter Holm} 41a7d46ad0SPeter Holm 42a7d46ad0SPeter Holmstatic uint64_t current_time_ms(void) 43a7d46ad0SPeter Holm{ 44a7d46ad0SPeter Holm struct timespec ts; 45a7d46ad0SPeter Holm if (clock_gettime(CLOCK_MONOTONIC, &ts)) 46a7d46ad0SPeter Holm exit(1); 47a7d46ad0SPeter Holm return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; 48a7d46ad0SPeter Holm} 49a7d46ad0SPeter Holm 50a7d46ad0SPeter Holmstatic void execute_one(void); 51a7d46ad0SPeter Holm 52a7d46ad0SPeter Holm#define WAIT_FLAGS 0 53a7d46ad0SPeter Holm 54a7d46ad0SPeter Holmstatic void loop(void) 55a7d46ad0SPeter Holm{ 56*7f658f99SPeter Holm int iter __unused = 0; 57a7d46ad0SPeter Holm for (;; iter++) { 58a7d46ad0SPeter Holm int pid = fork(); 59a7d46ad0SPeter Holm if (pid < 0) 60a7d46ad0SPeter Holm exit(1); 61a7d46ad0SPeter Holm if (pid == 0) { 62a7d46ad0SPeter Holm execute_one(); 63a7d46ad0SPeter Holm exit(0); 64a7d46ad0SPeter Holm } 65a7d46ad0SPeter Holm int status = 0; 66a7d46ad0SPeter Holm uint64_t start = current_time_ms(); 67a7d46ad0SPeter Holm for (;;) { 68a7d46ad0SPeter Holm if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid) 69a7d46ad0SPeter Holm break; 70a7d46ad0SPeter Holm sleep_ms(1); 71a7d46ad0SPeter Holm if (current_time_ms() - start < 5000) { 72a7d46ad0SPeter Holm continue; 73a7d46ad0SPeter Holm } 74a7d46ad0SPeter Holm kill_and_wait(pid, &status); 75a7d46ad0SPeter Holm break; 76a7d46ad0SPeter Holm } 77a7d46ad0SPeter Holm } 78a7d46ad0SPeter Holm} 79a7d46ad0SPeter Holm 80a7d46ad0SPeter Holmuint64_t r[1] = {0xffffffffffffffff}; 81a7d46ad0SPeter Holm 82a7d46ad0SPeter Holmvoid execute_one(void) 83a7d46ad0SPeter Holm{ 84a7d46ad0SPeter Holm intptr_t res = 0; 85a7d46ad0SPeter Holm memcpy((void*)0x20000000, "./file0\000", 8); 86a7d46ad0SPeter Holm syscall(SYS_mknodat, 0xffffff9c, 0x20000000ul, 0x1000ul, 0ul); 87a7d46ad0SPeter Holm memcpy((void*)0x20000040, "./file0\000", 8); 88a7d46ad0SPeter Holm syscall(SYS_open, 0x20000040ul, 0x400000ul, 0x72ul); 89a7d46ad0SPeter Holm res = syscall(SYS_kqueue); 90a7d46ad0SPeter Holm if (res != -1) 91a7d46ad0SPeter Holm r[0] = res; 92a7d46ad0SPeter Holm *(uint64_t*)0x20000100 = 3; 93a7d46ad0SPeter Holm *(uint16_t*)0x20000108 = -1; 94a7d46ad0SPeter Holm *(uint16_t*)0x2000010a = 0x4015; 95a7d46ad0SPeter Holm *(uint32_t*)0x2000010c = 0; 96a7d46ad0SPeter Holm *(uint64_t*)0x20000110 = 0x400000000; 97a7d46ad0SPeter Holm *(uint64_t*)0x20000118 = 5; 98a7d46ad0SPeter Holm *(uint64_t*)0x20000120 = 4; 99a7d46ad0SPeter Holm *(uint64_t*)0x20000128 = 0; 100a7d46ad0SPeter Holm *(uint64_t*)0x20000130 = 0; 101a7d46ad0SPeter Holm *(uint64_t*)0x20000138 = 0; 102a7d46ad0SPeter Holm syscall(SYS_kevent, r[0], 0x20000100ul, 0x2cul, 0ul, 0ul, 0ul); 103a7d46ad0SPeter Holm} 104a7d46ad0SPeter Holmint main(void) 105a7d46ad0SPeter Holm{ 106a7d46ad0SPeter Holm syscall(SYS_mmap, 0x20000000ul, 0x1000000ul, 7ul, 0x1012ul, -1, 0ul); 107a7d46ad0SPeter Holm loop(); 108a7d46ad0SPeter Holm return 0; 109a7d46ad0SPeter Holm} 110a7d46ad0SPeter Holm 111a7d46ad0SPeter Holm 112a7d46ad0SPeter HolmEOF 113a7d46ad0SPeter Holmmycc -o /tmp/syzkaller34 -Wall -Wextra -O0 /tmp/syzkaller34.c || 114a7d46ad0SPeter Holm exit 1 115a7d46ad0SPeter Holm 116a7d46ad0SPeter Holm(cd /tmp; timeout 3m ./syzkaller34) 117a7d46ad0SPeter Holm 118014a2b1aSPeter Holmrm -rf /tmp/syzkaller34 /tmp/syzkaller34.c /tmp/syzkaller.* 119a7d46ad0SPeter Holmexit 0 120