From 5f5b58a2c0cb576e3019942008cc755d54f58192 Mon Sep 17 00:00:00 2001 From: apio Date: Thu, 8 Jun 2023 19:58:00 +0200 Subject: [PATCH] apps: Add a syscall fuzzer --- apps/CMakeLists.txt | 1 + apps/sysfuzz.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 apps/sysfuzz.cpp diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 7f933321..489f69e7 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -30,3 +30,4 @@ luna_app(ps.cpp ps) luna_app(time.cpp time) luna_app(ln.cpp ln) luna_app(mktemp.cpp mktemp) +luna_app(sysfuzz.cpp sysfuzz) diff --git a/apps/sysfuzz.cpp b/apps/sysfuzz.cpp new file mode 100644 index 00000000..0eb3664f --- /dev/null +++ b/apps/sysfuzz.cpp @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include +#include + +static const char* syscall_list[] = { +#undef __enumerate +#define __enumerate(name) #name, + enumerate_syscalls(__enumerate) +#undef __enumerate +}; + +int random_syscall() +{ + int sys; + + while (true) + { + sys = rand() % Syscalls::__count; + if (sys == SYS_exit || sys == SYS_usleep || sys == SYS_fork) continue; + break; + } + + return sys; +} + +void random_args(int args[5]) +{ + for (int i = 0; i < 5; i++) { args[i] = rand(); } +} + +int main(int argc, char** argv) +{ + StringView times_sv = "20"_sv; + StringView interval_sv = "1000"_sv; + + os::ArgumentParser parser; + parser.add_description("System call fuzzer (invokes system calls with random arguments to test system stability)"); + parser.add_system_program_info("sysfuzz"_sv); + parser.add_value_argument(times_sv, 't', "times"_sv, true, "the number of syscalls to invoke"_sv); + parser.add_value_argument(interval_sv, 'i', "interval"_sv, true, + "the interval between system calls (in milliseconds)"_sv); + parser.parse(argc, argv); + + srand((unsigned)time(nullptr)); + + int times = atoi(times_sv.chars()); + int interval = atoi(interval_sv.chars()); + + while (times--) + { + int args[5]; + int sys = random_syscall(); + random_args(args); + + printf("%s(%d, %d, %d, %d, %d) -> ", syscall_list[sys], args[0], args[1], args[2], args[3], args[4]); + + long rc = syscall(sys, args[0], args[1], args[2], args[3], args[4]); + + if (rc < 0) + { + int error = (int)-rc; + printf("%ld (%s)\n", rc, strerror(error)); + } + else + printf("%ld\n", rc); + + usleep(interval * 1000); + } +}