[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b

Török Edvin edwin at clamav.net
Sun Apr 4 01:09:44 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit 322a0ea65338d69d3f52e6a32d091de7036f33d5
Author: Török Edvin <edwin at clamav.net>
Date:   Thu Nov 26 11:18:40 2009 +0200

    Fix bytecode load bugs. Make loading more robust: print error message instead of
    crashing.
    Able to load and dry-run yc_bytecode.o1.cbc now.

diff --git a/clamav-milter/netcode.c b/clamav-milter/netcode.c
index c6b3d82..bcdd16d 100644
--- a/clamav-milter/netcode.c
+++ b/clamav-milter/netcode.c
@@ -257,6 +257,8 @@ char *nc_recv(int s) {
 	}
 	if(res==-1) {
 	    char er[256];
+	    if (errno == EAGAIN)
+		continue;
 	    strerror_print("!recv failed after successful select");
 	    close(s);
 	    return NULL;
diff --git a/libclamav/bytecode.c b/libclamav/bytecode.c
index 0aa5624..9938071 100644
--- a/libclamav/bytecode.c
+++ b/libclamav/bytecode.c
@@ -63,6 +63,7 @@ int cli_bytecode_context_reset(struct cli_bc_ctx *ctx)
     free(ctx->opsizes);
     free(ctx->values);
     free(ctx->operands);
+    ctx->operands = ctx->values = ctx->opsizes = NULL;
     return CL_SUCCESS;
 }
 
diff --git a/libclamav/c++/bytecode2llvm.cpp b/libclamav/c++/bytecode2llvm.cpp
index 69f647d..f2f3d85 100644
--- a/libclamav/c++/bytecode2llvm.cpp
+++ b/libclamav/c++/bytecode2llvm.cpp
@@ -230,7 +230,12 @@ private:
 		return V;
 	    }
 	    V = Builder.CreateLoad(V);
-	    assert(V->getType() == Ty);
+	    if (V->getType() != Ty) {
+		errs() << operand << " ";
+		V->dump();
+		Ty->dump();
+		llvm_report_error("(libclamav) Type mismatch converting operand");
+	    }
 	    return V;
 	}
 	unsigned w = (Ty->getPrimitiveSizeInBits()+7)/8;
@@ -372,11 +377,9 @@ public:
     }
 
     template <typename InputIterator>
-    bool createGEP(unsigned dest, Value *Base, InputIterator Start, InputIterator End) {
-	assert(dest >= numArgs && dest < numLocals+numArgs && "Instruction destination out of range");
+    Value* createGEP(Value *Base, const Type *ETy, InputIterator Start, InputIterator End) {
 	const Type *Ty = GetElementPtrInst::getIndexedType(Base->getType(), Start, End);
-	const Type *ETy = cast<PointerType>(cast<PointerType>(Values[dest]->getType())->getElementType())->getElementType();
-	if (!Ty || (Ty != ETy && (!isa<IntegerType>(Ty) || !isa<IntegerType>(ETy)))) {
+	if (!Ty || (ETy && (Ty != ETy && (!isa<IntegerType>(Ty) || !isa<IntegerType>(ETy))))) {
 	    errs() << MODULE << "Wrong indices for GEP opcode: "
 		<< " expected type: " << *ETy;
 	    if (Ty)
@@ -386,12 +389,19 @@ public:
 		errs() << **I << ", ";
 	    }
 	    errs() << "\n";
-	    return false;
-	}
-	Value *V = Builder.CreateGEP(Base, Start, End);
-	if (Ty != ETy) {
-	    V = Builder.CreateBitCast(V, PointerType::getUnqual(ETy));
+	    return 0;
 	}
+	return Builder.CreateGEP(Base, Start, End);
+    }
+
+    template <typename InputIterator>
+    bool createGEP(unsigned dest, Value *Base, InputIterator Start, InputIterator End) {
+	assert(dest >= numArgs && dest < numLocals+numArgs && "Instruction destination out of range");
+	const Type *ETy = cast<PointerType>(cast<PointerType>(Values[dest]->getType())->getElementType())->getElementType();
+	Value *V = createGEP(Base, ETy, Start, End);
+	if (!V)
+	    return false;
+	V = Builder.CreateBitCast(V, PointerType::getUnqual(ETy));
 	Store(dest, V);
 	return true;
     }
@@ -402,8 +412,8 @@ public:
 	for (unsigned i=0;i<cli_apicall_maxglobal - _FIRST_GLOBAL;i++) {
 	    unsigned id = cli_globals[i].globalid;
 	    const Type *Ty = apiMap.get(cli_globals[i].type);
-	    if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty))
-		Ty = PointerType::getUnqual(ATy->getElementType());
+	    /*if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty))
+		Ty = PointerType::getUnqual(ATy->getElementType());*/
 	    GVtypeMap[id] = Ty;
 	}
 	FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context),
@@ -563,8 +573,14 @@ public:
 			ConstantInt::get(Type::getInt32Ty(Context), 0),
 			ConstantInt::get(Type::getInt32Ty(Context), bc->globals[i][0])
 		    };
-		    globals[i] = Builder.CreateInBoundsGEP(SpecialGV, C,
-							   C+2);
+		    globals[i] = createGEP(SpecialGV, 0, C, C+2);
+		    if (!globals[i]) {
+			errs() << i << ":" << g << ":" << bc->globals[i][0] <<"\n";
+			Ty->dump();
+			llvm_report_error("(libclamav) unable to create fake global");
+		    }
+		    else if(GetElementPtrInst *GI = dyn_cast<GetElementPtrInst>(globals[i]))
+			GI->setIsInBounds(true);
 		}
 	    }
 
@@ -602,6 +618,11 @@ public:
 				case 2:
 				    Op0 = convertOperand(func, inst, inst->u.binop[0]);
 				    Op1 = convertOperand(func, inst, inst->u.binop[1]);
+				    if (Op0->getType() != Op1->getType()) {
+					Op0->dump();
+					Op1->dump();
+					llvm_report_error("(libclamav) binop type mismatch");
+				    }
 				    break;
 				case 3:
 				    Op0 = convertOperand(func, inst, inst->u.three[0]);
@@ -816,9 +837,11 @@ public:
 			case OP_BC_STORE:
 			{
 			    Value *Dest = convertOperand(func, inst, inst->u.binop[1]);
-			    const Type *ETy = cast<PointerType>(Dest->getType())->getElementType();
-			    Builder.CreateStore(convertOperand(func, ETy, inst->u.binop[0]),
-						Dest);
+			    Value *V = convertOperand(func, inst, inst->u.binop[0]);
+			    const Type *VPTy = PointerType::getUnqual(V->getType());
+			    if (VPTy != Dest->getType())
+				Dest = Builder.CreateBitCast(Dest, VPTy);
+			    Builder.CreateStore(V, Dest);
 			    break;
 			}
 			case OP_BC_LOAD:
diff --git a/unit_tests/input/apicalls2.cbc b/unit_tests/input/apicalls2.cbc
index 5406399..0655053 100644
--- a/unit_tests/input/apicalls2.cbc
+++ b/unit_tests/input/apicalls2.cbc
@@ -4,7 +4,7 @@ Tedaa`cabjdebjdacb`bbjdb`bacb`bb`bb`bebfd
 Eababaabhd|afdgefcgdg`c``abbid|afdgefcgdgac``
 G``
 A`b`bLahbfdabgd```b`b`aa`b`b`aa`b`b`Fajac
-Bbgdaadb`@d at d``bb``b`bacabbabHonnkm``odHm``oonnkdaaadeab`bacHhgfedcbadTaaadaaab
+Bbgdaadb`@d at d``fb`aab`bacabbabHonnkm``odHm``oonnkdaaadeab`bacHhgfedcbadTaaadaaab
 Bb`baeabbaa`Honnkmjnmdaaafeab`baeHhgfedcbadb`bagoaafDm``odDmjnmdTcab`bag
 BTcab`bDmjnmdE
 Aab`bLabah`aa`b`b`Facaa
diff --git a/unit_tests/input/lsig.cbc b/unit_tests/input/lsig.cbc
index 46342cb..52c695f 100644
--- a/unit_tests/input/lsig.cbc
+++ b/unit_tests/input/lsig.cbc
@@ -1,4 +1,4 @@
-ClamBCaa`|``````|`bjaabp`clamcoincidencejb
+ClamBCaa`|``c``a```|`bjaabp`clamcoincidencejb
 Trojan.Foo.{A,B};Target:0;((0|1|2)=42,2);aabb;ffffffff;aaccee;f00d
 Tedebieebheebgeebfeebeeebdeebbeebaeebadebcdaa`acb`bbadb`bdb`db`bchbadbcebadbcebadbcebadbcecab`bdagahdaiahdaeahdabbaddabahdakah
 Eafaaafb`e|amcgefdgfgifbgegcgnfafmfef``

-- 
Debian repository for ClamAV



More information about the Pkg-clamav-commits mailing list