Fix after merge: update to fmap API.

0.96
Török Edvin 16 years ago
parent 46e2863c4c
commit 74b0023374
  1. 10
      clambc/bcrun.c
  2. 18
      libclamav/bytecode.c
  3. 7
      libclamav/bytecode.h
  4. 6
      libclamav/bytecode_api.c
  5. 3
      libclamav/bytecode_priv.h
  6. 4
      libclamav/matcher.c
  7. 3
      libclamav/pe.c
  8. 13
      libclamav/readdb.c

@ -23,6 +23,8 @@
#include "clamav-config.h"
#endif
#include "cltypes.h"
#include <sys/time.h>
#include <stdlib.h>
#include "bytecode.h"
#include "clamav.h"
#include "shared/optparser.h"
@ -158,18 +160,24 @@ int main(int argc, char *argv[])
}
if ((opt = optget(opts,"input"))->enabled) {
fmap_t *map;
fd = open(opt->strarg, O_RDONLY);
if (fd == -1) {
fprintf(stderr, "Unable to open input file %s: %s\n", opt->strarg, strerror(errno));
optfree(opts);
exit(5);
}
rc = cli_bytecode_context_setfile(ctx, fd);
map = fmap(fd, 0, 0);
if (!map) {
fprintf(stderr, "Unable to map input file %s\n", opt->strarg);
}
rc = cli_bytecode_context_setfile(ctx, map);
if (rc != CL_SUCCESS) {
fprintf(stderr, "Unable to set file %s: %s\n", opt->strarg, cl_strerror(rc));
optfree(opts);
exit(5);
}
funmap(map);
}

@ -43,7 +43,7 @@ struct cli_bc_ctx *cli_bytecode_context_alloc(void)
ctx->values = NULL;
ctx->operands = NULL;
ctx->opsizes = NULL;
ctx->fd = -1;
ctx->fmap = NULL;
ctx->off = 0;
ctx->ctx = NULL;
ctx->hooks.match_counts = nomatch;
@ -1541,24 +1541,22 @@ int cli_bytecode_done(struct cli_all_bc *allbc)
return cli_bytecode_done_jit(allbc);
}
int cli_bytecode_context_setfile(struct cli_bc_ctx *ctx, int fd)
int cli_bytecode_context_setfile(struct cli_bc_ctx *ctx, fmap_t *map)
{
struct stat buf;
ctx->fd = fd;
if (fstat(fd, &buf) == -1)
return CL_ESTAT;
ctx->file_size = buf.st_size;
ctx->fmap = map;
ctx->file_size = map->len + map->offset;
return 0;
}
int cli_bytecode_runlsig(const struct cli_all_bc *bcs, const struct cli_bc *bc, const char **virname, const uint32_t* lsigcnt, int fd)
int cli_bytecode_runlsig(const struct cli_all_bc *bcs, const struct cli_bc *bc, const char **virname, const uint32_t* lsigcnt, fmap_t *map)
{
int ret;
struct cli_bc_ctx ctx;
memset(&ctx, 0, sizeof(ctx));
cli_bytecode_context_setfuncid(&ctx, bc, 0);
ctx.hooks.match_counts = lsigcnt;
cli_bytecode_context_setfile(&ctx, fd);
cli_bytecode_context_setfile(&ctx, map);
cli_dbgmsg("Running bytecode for logical signature match\n");
ret = cli_bytecode_run(bcs, bc, &ctx);
@ -1580,13 +1578,13 @@ int cli_bytecode_runlsig(const struct cli_all_bc *bcs, const struct cli_bc *bc,
}
int cli_bytecode_runhook(const struct cl_engine *engine, struct cli_bc_ctx *ctx,
unsigned id, int fd, const char **virname)
unsigned id, fmap_t *map, const char **virname)
{
const unsigned *hooks = engine->hooks[id - _BC_START_HOOKS];
unsigned i, hooks_cnt = engine->hooks_cnt[id - _BC_START_HOOKS];
int ret;
cli_bytecode_context_setfile(ctx, fd);
cli_bytecode_context_setfile(ctx, map);
cli_dbgmsg("Bytecode executing hook id %u (%u hooks)\n", id, hooks_cnt);
for (i=0;i < hooks_cnt;i++) {
const struct cli_bc *bc = &engine->bcs.all_bcs[hooks[i]];

@ -24,6 +24,7 @@
#include <stdint.h>
#include "clambc.h"
#include <stdio.h>
#include "fmap.h"
struct cli_dbio;
struct cli_bc_ctx;
@ -80,7 +81,7 @@ void cli_bytecode_context_setctx(struct cli_bc_ctx *ctx, void *cctx);
int cli_bytecode_context_setfuncid(struct cli_bc_ctx *ctx, const struct cli_bc *bc, unsigned funcid);
int cli_bytecode_context_setparam_int(struct cli_bc_ctx *ctx, unsigned i, uint64_t c);
int cli_bytecode_context_setparam_ptr(struct cli_bc_ctx *ctx, unsigned i, void *data, unsigned datalen);
int cli_bytecode_context_setfile(struct cli_bc_ctx *ctx, int fd);
int cli_bytecode_context_setfile(struct cli_bc_ctx *ctx, fmap_t *map);
int cli_bytecode_context_setpe(struct cli_bc_ctx *ctx, const struct cli_pe_hook_data *data);
int cli_bytecode_context_clear(struct cli_bc_ctx *ctx);
/* returns file descriptor, sets tempfile. Caller takes ownership, and is
@ -99,8 +100,8 @@ int cli_bytecode_done(struct cli_all_bc *allbc);
/* Hooks */
struct cli_exe_info;
int cli_bytecode_runlsig(const struct cli_all_bc *bcs, const struct cli_bc* bc, const char **virname, const uint32_t* lsigcnt, int fd);
int cli_bytecode_runhook(const struct cl_engine *engine, struct cli_bc_ctx *ctx, unsigned id, int fd, const char **virname);
int cli_bytecode_runlsig(const struct cli_all_bc *bcs, const struct cli_bc* bc, const char **virname, const uint32_t* lsigcnt, fmap_t *fmap);
int cli_bytecode_runhook(const struct cl_engine *engine, struct cli_bc_ctx *ctx, unsigned id, fmap_t *map, const char **virname);
#ifdef __cplusplus
extern "C" {

@ -45,15 +45,15 @@ uint32_t cli_bcapi_test1(struct cli_bc_ctx *ctx, uint32_t a, uint32_t b)
int32_t cli_bcapi_read(struct cli_bc_ctx* ctx, uint8_t *data, int32_t size)
{
if (ctx->fd == -1)
if (!ctx->fmap)
return -1;
return pread(ctx->fd, data, size, ctx->off);
return fmap_readn(ctx->fmap, data, ctx->off, size);
}
int32_t cli_bcapi_seek(struct cli_bc_ctx* ctx, int32_t pos, uint32_t whence)
{
off_t off;
if (ctx->fd == -1)
if (!ctx->fmap)
return -1;
switch (whence) {
case 0:

@ -26,6 +26,7 @@
#include "type_desc.h"
#include "execs.h"
#include "bytecode_hooks.h"
#include "fmap.h"
typedef uint32_t operand_t;
typedef uint16_t bbid_t;
@ -114,7 +115,7 @@ struct cli_bc_ctx {
unsigned numParams;
size_t file_size;
off_t off;
int fd;
fmap_t *fmap;
const char *virname;
struct cli_bc_hooks hooks;
int outfd;

@ -460,7 +460,7 @@ int cli_fmap_scandesc(cli_ctx *ctx, cli_file_t ftype, uint8_t ftonly, struct cli
ret = CL_VIRUS;
break;
}
if (cli_bytecode_runlsig(&ctx->engine->bcs, troot->ac_lsigtable[i]->bc, ctx->virname, tdata.lsigcnt[i], desc) == CL_VIRUS) {
if (cli_bytecode_runlsig(&ctx->engine->bcs, troot->ac_lsigtable[i]->bc, ctx->virname, tdata.lsigcnt[i], map) == CL_VIRUS) {
ret = CL_VIRUS;
break;
}
@ -482,7 +482,7 @@ int cli_fmap_scandesc(cli_ctx *ctx, cli_file_t ftype, uint8_t ftonly, struct cli
ret = CL_VIRUS;
break;
}
if (cli_bytecode_runlsig(&ctx->engine->bcs, groot->ac_lsigtable[i]->bc, ctx->virname, gdata.lsigcnt[i], desc) == CL_VIRUS) {
if (cli_bytecode_runlsig(&ctx->engine->bcs, groot->ac_lsigtable[i]->bc, ctx->virname, gdata.lsigcnt[i], map) == CL_VIRUS) {
ret = CL_VIRUS;
break;
}

@ -424,7 +424,6 @@ int cli_scanpe(cli_ctx *ctx)
cli_errmsg("cli_scanpe: ctx == NULL\n");
return CL_ENULLARG;
}
offset = lseek(desc, 0, SEEK_CUR);
map = *ctx->fmap;
if(fmap_readn(map, &e_magic, 0, sizeof(e_magic)) != sizeof(e_magic)) {
cli_dbgmsg("Can't read DOS signature\n");
@ -2130,7 +2129,7 @@ int cli_scanpe(cli_ctx *ctx)
pedata.overlays_sz = fsize - overlays;
cli_bytecode_context_setpe(bc_ctx, &pedata);
cli_bytecode_context_setctx(bc_ctx, ctx);
ret = cli_bytecode_runhook(ctx->engine, bc_ctx, BC_PE_UNPACKER, desc, ctx->virname);
ret = cli_bytecode_runhook(ctx->engine, bc_ctx, BC_PE_UNPACKER, map, ctx->virname);
switch (ret) {
case CL_VIRUS:
return CL_VIRUS;

@ -900,14 +900,11 @@ static int load_oneldb(char *buffer, int chkpua, int chkign, struct cl_engine *e
return CL_EMALFDB;
}
subsigs = tokens_count-3;
} else if(subsigs != tokens_count - 3) {
cli_errmsg("cli_loadldb: The number of subsignatures (== %u) doesn't match the IDs in the logical expression (== %u)\n", tokens_count - 3, subsigs);
return CL_EMALFDB;
}
if(subsigs != tokens_count - 3) {
cli_errmsg("cli_loadldb: The number of subsignatures (== %u) doesn't match the IDs in the logical expression (== %u)\n", tokens_count - 3, subsigs);
ret = CL_EMALFDB;
break;
}
/* TDB */
memset(&tdb, 0, sizeof(tdb));
#ifdef USE_MPOOL
@ -962,10 +959,6 @@ static int load_oneldb(char *buffer, int chkpua, int chkign, struct cl_engine *e
root->ac_lsigtable = newtable;
for(i = 0; i < subsigs; i++) {
if(i + 3 >= tokens_count) {
cli_errmsg("cli_loadldb: Missing subsignature id %u\n", i);
return CL_EMALFDB;
}
lsigid[1] = i;
sig = tokens[3 + i];

Loading…
Cancel
Save