1 1.1 kamil //===- FuzzerUtilPosix.cpp - Misc utils for Posix. ------------------------===// 2 1.1 kamil // 3 1.1 kamil // The LLVM Compiler Infrastructure 4 1.1 kamil // 5 1.1 kamil // This file is distributed under the University of Illinois Open Source 6 1.1 kamil // License. See LICENSE.TXT for details. 7 1.1 kamil // 8 1.1 kamil //===----------------------------------------------------------------------===// 9 1.1 kamil // Misc utils implementation using Posix API. 10 1.1 kamil //===----------------------------------------------------------------------===// 11 1.1 kamil #include "FuzzerDefs.h" 12 1.1 kamil #if LIBFUZZER_POSIX 13 1.1 kamil #include "FuzzerIO.h" 14 1.1 kamil #include "FuzzerInternal.h" 15 1.1 kamil #include <cassert> 16 1.1 kamil #include <chrono> 17 1.1 kamil #include <cstring> 18 1.1 kamil #include <errno.h> 19 1.1 kamil #include <iomanip> 20 1.1 kamil #include <signal.h> 21 1.1 kamil #include <stdio.h> 22 1.1 kamil #include <sys/resource.h> 23 1.1 kamil #include <sys/syscall.h> 24 1.1 kamil #include <sys/time.h> 25 1.1 kamil #include <sys/types.h> 26 1.1 kamil #include <thread> 27 1.1 kamil #include <unistd.h> 28 1.1 kamil 29 1.1 kamil namespace fuzzer { 30 1.1 kamil 31 1.1 kamil static void AlarmHandler(int, siginfo_t *, void *) { 32 1.1 kamil Fuzzer::StaticAlarmCallback(); 33 1.1 kamil } 34 1.1 kamil 35 1.1 kamil static void CrashHandler(int, siginfo_t *, void *) { 36 1.1 kamil Fuzzer::StaticCrashSignalCallback(); 37 1.1 kamil } 38 1.1 kamil 39 1.1 kamil static void InterruptHandler(int, siginfo_t *, void *) { 40 1.1 kamil Fuzzer::StaticInterruptCallback(); 41 1.1 kamil } 42 1.1 kamil 43 1.1 kamil static void GracefulExitHandler(int, siginfo_t *, void *) { 44 1.1 kamil Fuzzer::StaticGracefulExitCallback(); 45 1.1 kamil } 46 1.1 kamil 47 1.1 kamil static void FileSizeExceedHandler(int, siginfo_t *, void *) { 48 1.1 kamil Fuzzer::StaticFileSizeExceedCallback(); 49 1.1 kamil } 50 1.1 kamil 51 1.1 kamil static void SetSigaction(int signum, 52 1.1 kamil void (*callback)(int, siginfo_t *, void *)) { 53 1.1 kamil struct sigaction sigact = {}; 54 1.1 kamil if (sigaction(signum, nullptr, &sigact)) { 55 1.1 kamil Printf("libFuzzer: sigaction failed with %d\n", errno); 56 1.1 kamil exit(1); 57 1.1 kamil } 58 1.1 kamil if (sigact.sa_flags & SA_SIGINFO) { 59 1.1 kamil if (sigact.sa_sigaction) 60 1.1 kamil return; 61 1.1 kamil } else { 62 1.1 kamil if (sigact.sa_handler != SIG_DFL && sigact.sa_handler != SIG_IGN && 63 1.1 kamil sigact.sa_handler != SIG_ERR) 64 1.1 kamil return; 65 1.1 kamil } 66 1.1 kamil 67 1.1 kamil sigact = {}; 68 1.1 kamil sigact.sa_sigaction = callback; 69 1.1 kamil if (sigaction(signum, &sigact, 0)) { 70 1.1 kamil Printf("libFuzzer: sigaction failed with %d\n", errno); 71 1.1 kamil exit(1); 72 1.1 kamil } 73 1.1 kamil } 74 1.1 kamil 75 1.1 kamil void SetTimer(int Seconds) { 76 1.1 kamil struct itimerval T { 77 1.1 kamil {Seconds, 0}, { Seconds, 0 } 78 1.1 kamil }; 79 1.1 kamil if (setitimer(ITIMER_REAL, &T, nullptr)) { 80 1.1 kamil Printf("libFuzzer: setitimer failed with %d\n", errno); 81 1.1 kamil exit(1); 82 1.1 kamil } 83 1.1 kamil SetSigaction(SIGALRM, AlarmHandler); 84 1.1 kamil } 85 1.1 kamil 86 1.1 kamil void SetSignalHandler(const FuzzingOptions& Options) { 87 1.1 kamil if (Options.UnitTimeoutSec > 0) 88 1.1 kamil SetTimer(Options.UnitTimeoutSec / 2 + 1); 89 1.1 kamil if (Options.HandleInt) 90 1.1 kamil SetSigaction(SIGINT, InterruptHandler); 91 1.1 kamil if (Options.HandleTerm) 92 1.1 kamil SetSigaction(SIGTERM, InterruptHandler); 93 1.1 kamil if (Options.HandleSegv) 94 1.1 kamil SetSigaction(SIGSEGV, CrashHandler); 95 1.1 kamil if (Options.HandleBus) 96 1.1 kamil SetSigaction(SIGBUS, CrashHandler); 97 1.1 kamil if (Options.HandleAbrt) 98 1.1 kamil SetSigaction(SIGABRT, CrashHandler); 99 1.1 kamil if (Options.HandleIll) 100 1.1 kamil SetSigaction(SIGILL, CrashHandler); 101 1.1 kamil if (Options.HandleFpe) 102 1.1 kamil SetSigaction(SIGFPE, CrashHandler); 103 1.1 kamil if (Options.HandleXfsz) 104 1.1 kamil SetSigaction(SIGXFSZ, FileSizeExceedHandler); 105 1.1 kamil if (Options.HandleUsr1) 106 1.1 kamil SetSigaction(SIGUSR1, GracefulExitHandler); 107 1.1 kamil if (Options.HandleUsr2) 108 1.1 kamil SetSigaction(SIGUSR2, GracefulExitHandler); 109 1.1 kamil } 110 1.1 kamil 111 1.1 kamil void SleepSeconds(int Seconds) { 112 1.1 kamil sleep(Seconds); // Use C API to avoid coverage from instrumented libc++. 113 1.1 kamil } 114 1.1 kamil 115 1.1 kamil unsigned long GetPid() { return (unsigned long)getpid(); } 116 1.1 kamil 117 1.1 kamil size_t GetPeakRSSMb() { 118 1.1 kamil struct rusage usage; 119 1.1 kamil if (getrusage(RUSAGE_SELF, &usage)) 120 1.1 kamil return 0; 121 1.1 kamil if (LIBFUZZER_LINUX || LIBFUZZER_FREEBSD || LIBFUZZER_NETBSD || 122 1.1 kamil LIBFUZZER_OPENBSD) { 123 1.1 kamil // ru_maxrss is in KiB 124 1.1 kamil return usage.ru_maxrss >> 10; 125 1.1 kamil } else if (LIBFUZZER_APPLE) { 126 1.1 kamil // ru_maxrss is in bytes 127 1.1 kamil return usage.ru_maxrss >> 20; 128 1.1 kamil } 129 1.1 kamil assert(0 && "GetPeakRSSMb() is not implemented for your platform"); 130 1.1 kamil return 0; 131 1.1 kamil } 132 1.1 kamil 133 1.1 kamil FILE *OpenProcessPipe(const char *Command, const char *Mode) { 134 1.1 kamil return popen(Command, Mode); 135 1.1 kamil } 136 1.1 kamil 137 1.1 kamil const void *SearchMemory(const void *Data, size_t DataLen, const void *Patt, 138 1.1 kamil size_t PattLen) { 139 1.1 kamil return memmem(Data, DataLen, Patt, PattLen); 140 1.1 kamil } 141 1.1 kamil 142 1.1 kamil std::string DisassembleCmd(const std::string &FileName) { 143 1.1 kamil return "objdump -d " + FileName; 144 1.1 kamil } 145 1.1 kamil 146 1.1 kamil std::string SearchRegexCmd(const std::string &Regex) { 147 1.1 kamil return "grep '" + Regex + "'"; 148 1.1 kamil } 149 1.1 kamil 150 1.1 kamil } // namespace fuzzer 151 1.1 kamil 152 1.1 kamil #endif // LIBFUZZER_POSIX 153