about summary refs log tree commit diff
path: root/llvm_mode/compare-transform-pass.so.cc
diff options
context:
space:
mode:
authorvan Hauser <vh@thc.org>2020-05-24 01:59:08 +0200
committervan Hauser <vh@thc.org>2020-05-24 01:59:08 +0200
commit68e66fa92090f7acd3555c8d64ee29ff97334f02 (patch)
tree52257333469b580292fe1b3c48d2ee213c303e9f /llvm_mode/compare-transform-pass.so.cc
parent38df6eb3a9d572d13a0554f6d511723feb644be6 (diff)
downloadafl++-68e66fa92090f7acd3555c8d64ee29ff97334f02.tar.gz
fix compare-transform for strn?casecmp
Diffstat (limited to 'llvm_mode/compare-transform-pass.so.cc')
-rw-r--r--llvm_mode/compare-transform-pass.so.cc10
1 files changed, 8 insertions, 2 deletions
diff --git a/llvm_mode/compare-transform-pass.so.cc b/llvm_mode/compare-transform-pass.so.cc
index 1ebc54d7..2f5eb341 100644
--- a/llvm_mode/compare-transform-pass.so.cc
+++ b/llvm_mode/compare-transform-pass.so.cc
@@ -438,9 +438,13 @@ bool CompareTransform::transformCmps(Module &M, const bool processStrcmp,
 
     for (uint64_t i = 0; i < constLen; i++) {
 
-      BasicBlock *cur_bb = next_bb;
+      BasicBlock *  cur_bb = next_bb;
+      unsigned char c;
 
-      char c = isCaseInsensitive ? tolower(ConstStr[i]) : ConstStr[i];
+      if (isCaseInsensitive)
+        c = (unsigned char)(tolower((int)ConstStr[i]) & 0xff);
+      else
+        c = (unsigned char)ConstStr[i];
 
       BasicBlock::iterator IP = next_bb->getFirstInsertionPt();
       IRBuilder<>          IRB(&*IP);
@@ -448,9 +452,11 @@ bool CompareTransform::transformCmps(Module &M, const bool processStrcmp,
       Value *v = ConstantInt::get(Int64Ty, i);
       Value *ele = IRB.CreateInBoundsGEP(VarStr, v, "empty");
       Value *load = IRB.CreateLoad(ele);
+
       if (isCaseInsensitive) {
 
         // load >= 'A' && load <= 'Z' ? load | 0x020 : load
+        load = IRB.CreateZExt(load, Int32Ty);
         std::vector<Value *> args;
         args.push_back(load);
         load = IRB.CreateCall(tolowerFn, args, "tmp");