blob: 486b81d66e0ba3d3c91a8e07b999353022c005e1 [file] [log] [blame]
// INFO: rcu detected stall in corrupted (3)
// https://syzkaller.appspot.com/bug?id=4ad312cd74149ae58624039b5b3003faf6974e08
// status:invalid
// autogenerated by syzkaller (https://github.com/google/syzkaller)
#define _GNU_SOURCE
#include <endian.h>
#include <setjmp.h>
#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
static __thread int skip_segv;
static __thread jmp_buf segv_env;
static void segv_handler(int sig, siginfo_t* info, void* ctx)
{
uintptr_t addr = (uintptr_t)info->si_addr;
const uintptr_t prog_start = 1 << 20;
const uintptr_t prog_end = 100 << 20;
if (__atomic_load_n(&skip_segv, __ATOMIC_RELAXED) &&
(addr < prog_start || addr > prog_end)) {
_longjmp(segv_env, 1);
}
exit(sig);
}
static void install_segv_handler(void)
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_IGN;
syscall(SYS_rt_sigaction, 0x20, &sa, NULL, 8);
syscall(SYS_rt_sigaction, 0x21, &sa, NULL, 8);
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = segv_handler;
sa.sa_flags = SA_NODEFER | SA_SIGINFO;
sigaction(SIGSEGV, &sa, NULL);
sigaction(SIGBUS, &sa, NULL);
}
#define NONFAILING(...) \
{ \
__atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST); \
if (_setjmp(segv_env) == 0) { \
__VA_ARGS__; \
} \
__atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST); \
}
static void use_temporary_dir(void)
{
char tmpdir_template[] = "./syzkaller.XXXXXX";
char* tmpdir = mkdtemp(tmpdir_template);
if (!tmpdir)
exit(1);
if (chmod(tmpdir, 0777))
exit(1);
if (chdir(tmpdir))
exit(1);
}
#ifndef __NR_sched_setattr
#define __NR_sched_setattr 314
#endif
int main(void)
{
syscall(__NR_mmap, 0x20000000, 0x1000000, 3, 0x32, -1, 0);
install_segv_handler();
use_temporary_dir();
NONFAILING(*(uint32_t*)0x20000140 = 0);
NONFAILING(*(uint32_t*)0x20000144 = 6);
NONFAILING(*(uint64_t*)0x20000148 = 0);
NONFAILING(*(uint32_t*)0x20000150 = 0);
NONFAILING(*(uint32_t*)0x20000154 = 0);
NONFAILING(*(uint64_t*)0x20000158 = 0xffff);
NONFAILING(*(uint64_t*)0x20000160 = 0x400000000000fffd);
NONFAILING(*(uint64_t*)0x20000168 = 0);
syscall(__NR_sched_setattr, 0, 0x20000140, 0);
return 0;
}