... | ... |
@@ -24,6 +24,7 @@ |
24 | 24 |
#include "clamav-config.h" |
25 | 25 |
#endif |
26 | 26 |
|
27 |
+#include <assert.h> |
|
27 | 28 |
#include "dconf.h" |
28 | 29 |
#include "clamav.h" |
29 | 30 |
#include "others.h" |
... | ... |
@@ -598,6 +599,7 @@ static int parseTypes(struct cli_bc *bc, unsigned char *buffer) |
598 | 598 |
case 3: |
599 | 599 |
ty->kind = (t == 2) ? DPackedStructType : DStructType; |
600 | 600 |
ty->size = ty->align = 0;/* TODO:calculate size/align of structs */ |
601 |
+ ty->align = 8; |
|
601 | 602 |
parseType(bc, ty, buffer, &offset, len, &ok); |
602 | 603 |
if (!ok) { |
603 | 604 |
cli_errmsg("Error parsing type %u\n", i); |
... | ... |
@@ -1386,6 +1388,7 @@ int cli_bytecode_run(const struct cli_all_bc *bcs, const struct cli_bc *bc, stru |
1386 | 1386 |
memset(&func, 0, sizeof(func)); |
1387 | 1387 |
func.numInsts = 1; |
1388 | 1388 |
func.numValues = 1; |
1389 |
+ func.numConstants = 0; |
|
1389 | 1390 |
func.numBytes = ctx->bytes; |
1390 | 1391 |
memset(ctx->values+ctx->bytes-8, 0, 8); |
1391 | 1392 |
|
... | ... |
@@ -1487,10 +1490,12 @@ static int cli_bytecode_prepare_interpreter(struct cli_bc *bc) |
1487 | 1487 |
struct cli_bc_func *bcfunc = &bc->funcs[i]; |
1488 | 1488 |
unsigned totValues = bcfunc->numValues + bcfunc->numConstants + bc->num_globals; |
1489 | 1489 |
unsigned *map = cli_malloc(sizeof(*map)*totValues); |
1490 |
+ bcfunc->numBytes = 0; |
|
1490 | 1491 |
for (j=0;j<bcfunc->numValues;j++) { |
1491 | 1492 |
uint16_t ty = bcfunc->types[j]; |
1492 | 1493 |
unsigned align; |
1493 | 1494 |
align = typealign(bc, ty); |
1495 |
+ assert(align); |
|
1494 | 1496 |
bcfunc->numBytes = (bcfunc->numBytes + align-1)&(~(align-1)); |
1495 | 1497 |
map[j] = bcfunc->numBytes; |
1496 | 1498 |
bcfunc->numBytes += typesize(bc, ty); |
... | ... |
@@ -1503,6 +1508,7 @@ static int cli_bytecode_prepare_interpreter(struct cli_bc *bc) |
1503 | 1503 |
for (j=0;j<bc->num_globals;j++) { |
1504 | 1504 |
uint16_t ty = bc->globaltys[j]; |
1505 | 1505 |
unsigned align = typealign(bc, ty); |
1506 |
+ assert(align); |
|
1506 | 1507 |
bcfunc->numBytes = (bcfunc->numBytes + align-1)&(~(align-1)); |
1507 | 1508 |
map[bcfunc->numValues+bcfunc->numConstants+j] = bcfunc->numBytes; |
1508 | 1509 |
bcfunc->numBytes += typesize(bc, ty); |
... | ... |
@@ -728,6 +728,10 @@ int cli_vm_execute(const struct cli_bc *bc, struct cli_bc_ctx *ctx, const struct |
728 | 728 |
{ |
729 | 729 |
const union unaligned_32 *ptr; |
730 | 730 |
READP(ptr, inst->u.unaryop); |
731 |
+ if (!ptr) { |
|
732 |
+ cli_dbgmsg("Bytecode attempted to load from null pointer!\n"); |
|
733 |
+ return CL_EBYTECODE; |
|
734 |
+ } |
|
731 | 735 |
WRITE32(inst->dest, (ptr->una_u32)); |
732 | 736 |
break; |
733 | 737 |
} |