diff options
-rw-r--r-- | llvm_mode/afl-llvm-pass.so.cc | 16 | ||||
-rw-r--r-- | llvm_mode/afl-llvm-rt.o.c | 2 |
2 files changed, 18 insertions, 0 deletions
diff --git a/llvm_mode/afl-llvm-pass.so.cc b/llvm_mode/afl-llvm-pass.so.cc index 31d00fec..058ab71f 100644 --- a/llvm_mode/afl-llvm-pass.so.cc +++ b/llvm_mode/afl-llvm-pass.so.cc @@ -682,6 +682,22 @@ bool AFLCoverage::runOnModule(Module &M) { } + // in CTX mode we have to restore the original context for the caller - + // she might be calling other functions which need the correct CTX + if (ctx_str) { + + Instruction *Inst = BB.getTerminator(); + if (isa<ReturnInst>(Inst) || isa<ResumeInst>(Inst)) { + + IRBuilder<> Post_IRB(Inst); + StoreInst * RestoreCtx = Post_IRB.CreateStore(PrevCtx, AFLContext); + RestoreCtx->setMetadata(M.getMDKindID("nosanitize"), + MDNode::get(C, None)); + + } + + } + inst_blocks++; } diff --git a/llvm_mode/afl-llvm-rt.o.c b/llvm_mode/afl-llvm-rt.o.c index f6c60a11..aac7d061 100644 --- a/llvm_mode/afl-llvm-rt.o.c +++ b/llvm_mode/afl-llvm-rt.o.c @@ -273,6 +273,7 @@ static void __afl_start_snapshots(void) { } } + #endif /* Fork server logic. */ @@ -287,6 +288,7 @@ static void __afl_start_forkserver(void) { return; } + #endif static u8 tmp[4]; |