[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:11:45 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit 482e97dbb2e1715c42a510667099fd62d70729fc
Author: Török Edvin <edwin at clamav.net>
Date:   Fri Dec 11 16:05:38 2009 +0200

    Support for bytecode lines >8k.
    
    Size is specified on first line (which must be <8k).

diff --git a/libclamav/bytecode.c b/libclamav/bytecode.c
index 6674ebf..44e02dd 100644
--- a/libclamav/bytecode.c
+++ b/libclamav/bytecode.c
@@ -403,12 +403,13 @@ static inline char *readString(const unsigned char *p, unsigned *off, unsigned l
     return str;
 }
 
-static int parseHeader(struct cli_bc *bc, unsigned char *buffer)
+static int parseHeader(struct cli_bc *bc, unsigned char *buffer, unsigned *linelength)
 {
     uint64_t magic1;
     unsigned magic2;
     char ok = 1;
     unsigned offset, len, flevel;
+    char *pos;
     if (strncmp((const char*)buffer, BC_HEADER, sizeof(BC_HEADER)-1)) {
 	cli_errmsg("Missing file magic in bytecode");
 	return CL_EMALFDB;
@@ -420,7 +421,7 @@ static int parseHeader(struct cli_bc *bc, unsigned char *buffer)
 	cli_errmsg("Unable to parse functionality level in bytecode header\n");
 	return CL_EMALFDB;
     }
-    if (flevel > BC_FUNC_LEVEL) {
+    if (flevel != BC_FUNC_LEVEL) {
 	cli_dbgmsg("Skipping bytecode with functionality level: %u\n", flevel);
 	return CL_BREAK;
     }
@@ -451,9 +452,14 @@ static int parseHeader(struct cli_bc *bc, unsigned char *buffer)
       cli_errmsg("Magic numbers don't match: %lx%lx, %u\n", m0, m1, magic2);
       return CL_EMALFDB;
     }
-    if (offset != len) {
-	cli_errmsg("Trailing garbage in bytecode header: %d extra bytes\n",
-		   len-offset);
+    if (buffer[offset] != ':') {
+	cli_errmsg("Expected : but found: %c\n", buffer[offset]);
+	return CL_EMALFDB;
+    }
+    offset++;
+    *linelength = strtol(buffer+offset, &pos, 10);
+    if (*pos != '\n') {
+	cli_errmsg("Invalid number: %s\n", buffer+offset);
 	return CL_EMALFDB;
     }
 
@@ -1169,8 +1175,7 @@ static int parseBB(struct cli_bc *bc, unsigned func, unsigned bb, unsigned char
 }
 
 enum parse_state {
-    PARSE_BC_HEADER=0,
-    PARSE_BC_TYPES,
+    PARSE_BC_TYPES=0,
     PARSE_BC_APIS,
     PARSE_BC_GLOBALS,
     PARSE_BC_LSIG,
@@ -1182,38 +1187,49 @@ enum parse_state {
 int cli_bytecode_load(struct cli_bc *bc, FILE *f, struct cli_dbio *dbio)
 {
     unsigned row = 0, current_func = 0, bb=0;
-    char buffer[FILEBUFF];
-    enum parse_state state = PARSE_BC_HEADER;
+    char *buffer;
+    unsigned linelength=0;
+    char firstbuf[FILEBUFF];
+    enum parse_state state;
+    int rc;
 
     if (!f && !dbio) {
 	cli_errmsg("Unable to load bytecode (null file)\n");
 	return CL_ENULLARG;
     }
-    while (cli_dbgets(buffer, FILEBUFF, f, dbio)) {
-	int rc;
+    if (!cli_dbgets(firstbuf, FILEBUFF, f, dbio)) {
+	cli_errmsg("Unable to load bytecode (empty file)\n");
+	return CL_EMALFDB;
+    }
+    rc = parseHeader(bc, (unsigned char*)firstbuf, &linelength);
+    if (rc == CL_BREAK) {
+	bc->state = bc_skip;
+	return CL_SUCCESS;
+    }
+    if (rc != CL_SUCCESS) {
+	cli_errmsg("Error at bytecode line %u\n", row);
+	return rc;
+    }
+    buffer = cli_malloc(linelength);
+    if (!buffer) {
+	cli_errmsg("Out of memory allocating line of length %u\n", linelength);
+	return CL_EMEM;
+    }
+    state = PARSE_BC_LSIG;
+    while (cli_dbgets(buffer, linelength, f, dbio)) {
 	cli_chomp(buffer);
 	row++;
 	switch (state) {
-	    case PARSE_BC_HEADER:
-		rc = parseHeader(bc, (unsigned char*)buffer);
-		if (rc == CL_BREAK) /* skip */ {
-		    bc->state = bc_skip;
-		    return CL_SUCCESS;
-		}
-		if (rc != CL_SUCCESS) {
-		    cli_errmsg("Error at bytecode line %u\n", row);
-		    return rc;
-		}
-		state = PARSE_BC_LSIG;
-		break;
 	    case PARSE_BC_LSIG:
 		rc = parseLSig(bc, (unsigned char*)buffer);
 		if (rc == CL_BREAK) /* skip */ {
 		    bc->state = bc_skip;
+		    free(buffer);
 		    return CL_SUCCESS;
 		}
 		if (rc != CL_SUCCESS) {
 		    cli_errmsg("Error at bytecode line %u\n", row);
+		    free(buffer);
 		    return rc;
 		}
 		state = PARSE_BC_TYPES;
@@ -1222,6 +1238,7 @@ int cli_bytecode_load(struct cli_bc *bc, FILE *f, struct cli_dbio *dbio)
 		rc = parseTypes(bc, (unsigned char*)buffer);
 		if (rc != CL_SUCCESS) {
 		    cli_errmsg("Error at bytecode line %u\n", row);
+		    free(buffer);
 		    return rc;
 		}
 		state = PARSE_BC_APIS;
@@ -1230,10 +1247,12 @@ int cli_bytecode_load(struct cli_bc *bc, FILE *f, struct cli_dbio *dbio)
 		rc = parseApis(bc, (unsigned char*)buffer);
 		if (rc == CL_BREAK) /* skip */ {
 		    bc->state = bc_skip;
+		    free(buffer);
 		    return CL_SUCCESS;
 		}
 		if (rc != CL_SUCCESS) {
 		    cli_errmsg("Error at bytecode line %u\n", row);
+		    free(buffer);
 		    return rc;
 		}
 		state = PARSE_BC_GLOBALS;
@@ -1242,10 +1261,12 @@ int cli_bytecode_load(struct cli_bc *bc, FILE *f, struct cli_dbio *dbio)
 		rc = parseGlobals(bc, (unsigned char*)buffer);
 		if (rc == CL_BREAK) /* skip */ {
 		    bc->state = bc_skip;
+		    free(buffer);
 		    return CL_SUCCESS;
 		}
 		if (rc != CL_SUCCESS) {
 		    cli_errmsg("Error at bytecode line %u\n", row);
+		    free(buffer);
 		    return rc;
 		}
 		state = PARSE_MD_OPT_HEADER;
@@ -1255,6 +1276,7 @@ int cli_bytecode_load(struct cli_bc *bc, FILE *f, struct cli_dbio *dbio)
 		    rc = parseMD(bc, (unsigned char*)buffer);
 		    if (rc != CL_SUCCESS) {
 			cli_errmsg("Error at bytecode line %u\n", row);
+			free(buffer);
 			return rc;
 		    }
 		    break;
@@ -1264,6 +1286,7 @@ int cli_bytecode_load(struct cli_bc *bc, FILE *f, struct cli_dbio *dbio)
 		rc = parseFunctionHeader(bc, current_func, (unsigned char*)buffer);
 		if (rc != CL_SUCCESS) {
 		    cli_errmsg("Error at bytecode line %u\n", row);
+		    free(buffer);
 		    return rc;
 		}
 		bb = 0;
@@ -1273,12 +1296,14 @@ int cli_bytecode_load(struct cli_bc *bc, FILE *f, struct cli_dbio *dbio)
 		rc = parseBB(bc, current_func, bb++, (unsigned char*)buffer);
 		if (rc != CL_SUCCESS) {
 		    cli_errmsg("Error at bytecode line %u\n", row);
+		    free(buffer);
 		    return rc;
 		}
 		if (bb >= bc->funcs[current_func].numBB) {
 		    if (bc->funcs[current_func].insn_idx != bc->funcs[current_func].numInsts) {
 			cli_errmsg("Parsed different number of instructions than declared: %u != %u\n",
 				   bc->funcs[current_func].insn_idx, bc->funcs[current_func].numInsts);
+			free(buffer);
 			return CL_EMALFDB;
 		    }
 		    cli_dbgmsg("Parsed %u BBs, %u instructions\n",
@@ -1289,6 +1314,7 @@ int cli_bytecode_load(struct cli_bc *bc, FILE *f, struct cli_dbio *dbio)
 		break;
 	}
     }
+    free(buffer);
     cli_dbgmsg("Parsed %d functions\n", current_func);
     if (current_func != bc->num_func) {
 	cli_errmsg("Loaded less functions than declared: %u vs. %u\n",
diff --git a/libclamav/c++/bytecode2llvm.cpp b/libclamav/c++/bytecode2llvm.cpp
index 3136a16..4cd9d40 100644
--- a/libclamav/c++/bytecode2llvm.cpp
+++ b/libclamav/c++/bytecode2llvm.cpp
@@ -1187,7 +1187,10 @@ int bytecode_init(void)
 
 #ifdef CL_DEBUG
     llvm::JITEmitDebugInfo = true;
+#else
+    llvm::JITEmitDebugInfo = false;
 #endif
+    llvm::DwarfExceptionHandling = false;
     llvm_start_multithreaded();
 
     // If we have a native target, initialize it to ensure it is linked in and
diff --git a/libclamav/clambc.h b/libclamav/clambc.h
index 32bde15..9fceb5a 100644
--- a/libclamav/clambc.h
+++ b/libclamav/clambc.h
@@ -28,7 +28,7 @@ struct bytecode_metadata {
   char *targetExclude;
 };
 
-#define BC_FUNC_LEVEL 1
+#define BC_FUNC_LEVEL 2
 #define BC_HEADER "ClamBC"
 
 enum bc_opcode {
diff --git a/unit_tests/input/apicalls.cbc b/unit_tests/input/apicalls.cbc
index 999cb21..e3e2bd6 100644
--- a/unit_tests/input/apicalls.cbc
+++ b/unit_tests/input/apicalls.cbc
@@ -1,4 +1,4 @@
-ClamBCaa`|``````|`agafp`clamcoincidencejb
+ClamBCab`|``````|`agafp`clamcoincidencejb:82
 
 Tedaaa`aacb`bb`bb`b
 Eabaaabbfd|afdgefcgdgac``
diff --git a/unit_tests/input/apicalls2.cbc b/unit_tests/input/apicalls2.cbc
index ffa26de..7d303c2 100644
--- a/unit_tests/input/apicalls2.cbc
+++ b/unit_tests/input/apicalls2.cbc
@@ -1,4 +1,4 @@
-ClamBCaa`|``````|`akafp`clamcoincidencejb
+ClamBCab`|``````|`akafp`clamcoincidencejb:82
 
 Tedcaabjdebjdaaa`aacb`bbjdb`baacb`bb`bb`bebed
 Eababaabhd|afdgefcgdg`c``abbid|afdgefcgdgac``
diff --git a/unit_tests/input/arith.cbc b/unit_tests/input/arith.cbc
index a9f0f5f..751b41e 100644
--- a/unit_tests/input/arith.cbc
+++ b/unit_tests/input/arith.cbc
@@ -1,4 +1,4 @@
-ClamBCaa`|``````|`afbbep`clamcoincidencejb
+ClamBCab`|``````|`afbbep`clamcoincidencejb:418
 
 Tedaaa`
 E``
diff --git a/unit_tests/input/div0.cbc b/unit_tests/input/div0.cbc
index f416be4..224c97a 100644
--- a/unit_tests/input/div0.cbc
+++ b/unit_tests/input/div0.cbc
@@ -1,4 +1,4 @@
-ClamBCaa`|``````|`afabp`clamcoincidencejb
+ClamBCab`|``````|`afabp`clamcoincidencejb:23
 
 Tedaaa`
 E``
diff --git a/unit_tests/input/lsig.cbc b/unit_tests/input/lsig.cbc
index 9637599..2aecc8a 100644
--- a/unit_tests/input/lsig.cbc
+++ b/unit_tests/input/lsig.cbc
@@ -1,4 +1,4 @@
-ClamBCaa`|``c``a```|`bjaabp`clamcoincidencejb
+ClamBCab`|``c``a```|`bjaabp`clamcoincidencejb:326
 Trojan.Foo.{A,B};Target:1;(((0|1|2)=42,2)|(3=10));EP+0:aabb;ffff;aaccee;f00d;dead
 Tedebieebheebgeebfeebeeebdeebbeebaeebadebcdaaa`aacb`bbadb`bdb`db`bcajbadbcebadbcebadbcebadbcebadbcecaab`bdagahdaeahdajahdabbaddabahdakah
 Eafaaafb`e|amcgefdgfgifbgegcgnfafmfef``
diff --git a/unit_tests/input/retmagic.cbc b/unit_tests/input/retmagic.cbc
index 41b5c61..6c3a6f2 100644
--- a/unit_tests/input/retmagic.cbc
+++ b/unit_tests/input/retmagic.cbc
@@ -1,4 +1,4 @@
-ClamBCaa`|``````|`afaap`clamcoincidencejb
+ClamBCab`|``````|`afaap`clamcoincidencejb:20
 
 Tedaaa`
 E``

-- 
Debian repository for ClamAV



More information about the Pkg-clamav-commits mailing list