[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