diff options
author | vanhauser-thc <vh@thc.org> | 2022-03-17 15:48:06 +0100 |
---|---|---|
committer | vanhauser-thc <vh@thc.org> | 2022-03-17 15:48:06 +0100 |
commit | 3c11a377570512efeb3a197148ff1b7dddbd8e32 (patch) | |
tree | 4ff4f3cae62befaafaee2f605e3cc7a56f46ed9d | |
parent | e4f201707fdfbf9a36b6a48c16f75b0fef2c9e75 (diff) | |
download | afl++-3c11a377570512efeb3a197148ff1b7dddbd8e32.tar.gz |
fixes for llvm < 11
-rw-r--r-- | instrumentation/SanitizerCoveragePCGUARD.so.cc | 2 | ||||
-rw-r--r-- | instrumentation/afl-llvm-dict2file.so.cc | 111 | ||||
-rw-r--r-- | instrumentation/compare-transform-pass.so.cc | 19 | ||||
-rw-r--r-- | src/afl-ld-lto.c | 3 |
4 files changed, 69 insertions, 66 deletions
diff --git a/instrumentation/SanitizerCoveragePCGUARD.so.cc b/instrumentation/SanitizerCoveragePCGUARD.so.cc index a5d8f895..e234cf57 100644 --- a/instrumentation/SanitizerCoveragePCGUARD.so.cc +++ b/instrumentation/SanitizerCoveragePCGUARD.so.cc @@ -242,7 +242,7 @@ class ModuleSanitizerCoverageLegacyPass : public ModulePass { } /*static*/ char ID; // Pass identification, replacement for typeid - StringRef getPassName() const override { + StringRef getPassName() const override { return "ModuleSanitizerCoverage"; diff --git a/instrumentation/afl-llvm-dict2file.so.cc b/instrumentation/afl-llvm-dict2file.so.cc index 37cd8ad0..79cdf491 100644 --- a/instrumentation/afl-llvm-dict2file.so.cc +++ b/instrumentation/afl-llvm-dict2file.so.cc @@ -45,7 +45,6 @@ #include "llvm/IR/PassManager.h" #else #include "llvm/IR/LegacyPassManager.h" - #include "llvm/Transforms/IPO/PassManagerBuilder.h" #endif #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Module.h" @@ -67,47 +66,6 @@ #define O_DSYNC O_SYNC #endif -std::ofstream of; - -void dict2file(u8 *mem, u32 len) { - - u32 i, j, binary = 0; - char line[MAX_AUTO_EXTRA * 8], tmp[8]; - - strcpy(line, "\""); - j = 1; - for (i = 0; i < len; i++) { - - if (isprint(mem[i]) && mem[i] != '\\' && mem[i] != '"') { - - line[j++] = mem[i]; - - } else { - - if (i + 1 != len || mem[i] != 0 || binary || len == 4 || len == 8) { - - line[j] = 0; - sprintf(tmp, "\\x%02x", (u8)mem[i]); - strcat(line, tmp); - j = strlen(line); - - } - - binary = 1; - - } - - } - - line[j] = 0; - strcat(line, "\"\n"); - of << line; - of.flush(); - - if (!be_quiet) fprintf(stderr, "Found dictionary token: %s", line); - -} - using namespace llvm; namespace { @@ -115,14 +73,22 @@ namespace { #if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */ class AFLdict2filePass : public PassInfoMixin<AFLdict2filePass> { + std::ofstream of; + void dict2file(u8 *, u32); + public: AFLdict2filePass() { #else + class AFLdict2filePass : public ModulePass { + std::ofstream of; + void dict2file(u8 *, u32); + public: - bool runOnModule(Module &M) override; + static char ID; + AFLdict2filePass() : ModulePass(ID) { #endif @@ -133,6 +99,8 @@ class AFLdict2filePass : public ModulePass { #if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */ PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM); +#else + bool runOnModule(Module &M) override; #endif }; @@ -143,7 +111,7 @@ class AFLdict2filePass : public ModulePass { extern "C" ::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK llvmGetPassPluginInfo() { - return {LLVM_PLUGIN_API_VERSION, "dict2file", "v0.1", + return {LLVM_PLUGIN_API_VERSION, "AFLdict2filePass", "v0.1", /* lambda to insert our pass into the pass pipeline. */ [](PassBuilder &PB) { @@ -162,16 +130,52 @@ llvmGetPassPluginInfo() { } #else - char AFLdict2filePass::ID = 0; - #endif +void AFLdict2filePass::dict2file(u8 *mem, u32 len) { + + u32 i, j, binary = 0; + char line[MAX_AUTO_EXTRA * 8], tmp[8]; + + strcpy(line, "\""); + j = 1; + for (i = 0; i < len; i++) { + + if (isprint(mem[i]) && mem[i] != '\\' && mem[i] != '"') { + + line[j++] = mem[i]; + + } else { + + if (i + 1 != len || mem[i] != 0 || binary || len == 4 || len == 8) { + + line[j] = 0; + sprintf(tmp, "\\x%02x", (u8)mem[i]); + strcat(line, tmp); + j = strlen(line); + + } + + binary = 1; + + } + + } + + line[j] = 0; + strcat(line, "\"\n"); + of << line; + of.flush(); + + if (!be_quiet) fprintf(stderr, "Found dictionary token: %s", line); + +} + #if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */ PreservedAnalyses AFLdict2filePass::run(Module &M, ModuleAnalysisManager &MAM) { #else - bool AFLdict2filePass::runOnModule(Module &M) { #endif @@ -640,6 +644,7 @@ bool AFLdict2filePass::runOnModule(Module &M) { if (optLen < 2) { continue; } if (literalLength + 1 == optLen) { // add null byte + thestring.append("\0", 1); } @@ -662,17 +667,11 @@ bool AFLdict2filePass::runOnModule(Module &M) { } */ - - if (!isStdString) { + if (!isStdString && thestring.find('\0', 0) != std::string::npos) { // ensure we do not have garbage size_t offset = thestring.find('\0', 0); - if (offset && offset < optLen && offset + 1 < optLen) { - - optLen = offset + 1; - - } - + if (offset + 1 < optLen) optLen = offset + 1; thestring = thestring.substr(0, optLen); } @@ -716,8 +715,6 @@ bool AFLdict2filePass::runOnModule(Module &M) { #if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */ auto PA = PreservedAnalyses::all(); -#endif -#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */ return PA; #else return true; diff --git a/instrumentation/compare-transform-pass.so.cc b/instrumentation/compare-transform-pass.so.cc index 4e471ea3..34c88735 100644 --- a/instrumentation/compare-transform-pass.so.cc +++ b/instrumentation/compare-transform-pass.so.cc @@ -88,21 +88,26 @@ class CompareTransform : public ModulePass { const char *getPassName() const override { #endif + + return "cmplog transform"; + + } + #endif #if LLVM_MAJOR >= 11 /* use new pass manager */ - PreservedAnalyses run(Module & M, ModuleAnalysisManager & MAM); + PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM); #else bool runOnModule(Module &M) override; #endif - private: - bool transformCmps(Module & M, const bool processStrcmp, - const bool processMemcmp, const bool processStrncmp, - const bool processStrcasecmp, - const bool processStrncasecmp); + private: + bool transformCmps(Module &M, const bool processStrcmp, + const bool processMemcmp, const bool processStrncmp, + const bool processStrcasecmp, + const bool processStrncasecmp); - }; +}; } // namespace diff --git a/src/afl-ld-lto.c b/src/afl-ld-lto.c index f2f95fd7..5797def8 100644 --- a/src/afl-ld-lto.c +++ b/src/afl-ld-lto.c @@ -237,7 +237,8 @@ static void edit_params(int argc, char **argv) { } if (!rt_present) - ld_params[ld_param_cnt++] = alloc_printf("%s/afl-compiler-rt.o", afl_path); + ld_params[ld_param_cnt++] = + alloc_printf("%s/afl-compiler-rt.o", afl_path); if (!rt_lto_present) ld_params[ld_param_cnt++] = alloc_printf("%s/afl-llvm-rt-lto.o", afl_path); |