[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:27:40 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit b00a7cc8f86bb497e30aeb9f914a91e371c0c4f3
Author: Török Edvin <edwin at clamav.net>
Date:   Wed Mar 31 10:53:11 2010 +0300

    jsnorm api.

diff --git a/libclamav/bytecode.c b/libclamav/bytecode.c
index 4a04a24..599b336 100644
--- a/libclamav/bytecode.c
+++ b/libclamav/bytecode.c
@@ -25,6 +25,7 @@
 #endif
 
 #include <assert.h>
+#include <fcntl.h>
 #include "dconf.h"
 #include "clamav.h"
 #include "others.h"
@@ -110,11 +111,36 @@ static int cli_bytecode_context_reset(struct cli_bc_ctx *ctx)
 	ctx->tempfile = NULL;
 	ctx->outfd = 0;
     }
+    if (ctx->jsnormdir) {
+	char fullname[1025];
+	cli_ctx *cctx = ctx->ctx;
+	int fd, ret = CL_CLEAN;
+
+	if (!ctx->found) {
+	    snprintf(fullname, 1024, "%s"PATHSEP"javascript", ctx->jsnormdir);
+	    fd = open(fullname, O_RDONLY|O_BINARY);
+	    if(fd >= 0) {
+		ret = cli_scandesc(fd, cctx, CL_TYPE_HTML, 0, NULL, AC_SCAN_VIR);
+		if (ret == CL_CLEAN) {
+		    lseek(fd, 0, SEEK_SET);
+		    ret = cli_scandesc(fd, cctx, CL_TYPE_TEXT_ASCII, 0, NULL, AC_SCAN_VIR);
+		}
+		close(fd);
+	    }
+	}
+	if (!cctx || !cctx->engine->keeptmp) {
+	    cli_rmdirs(ctx->jsnormdir);
+	}
+	free(ctx->jsnormdir);
+	if (ret != CL_CLEAN)
+	    ctx->found = 1;
+    }
     ctx->numParams = 0;
     ctx->funcid = 0;
     ctx->file_size = 0;
     ctx->off = 0;
     ctx->written = 0;
+    ctx->jsnormwritten = 0;
 #if USE_MPOOL
     if (ctx->mpool) {
 	mpool_destroy(ctx->mpool);
@@ -140,6 +166,13 @@ static int cli_bytecode_context_reset(struct cli_bc_ctx *ctx)
     free(ctx->hashsets);
     ctx->hashsets = NULL;
     ctx->nhashsets = 0;
+
+    for (i=0;i<ctx->njsnorms;i++)
+	cli_bcapi_jsnorm_done(ctx, i);
+    free(ctx->jsnorms);
+    ctx->jsnorms = NULL;
+    ctx->njsnorms = 0;
+    ctx->jsnormdir = NULL;
     return CL_SUCCESS;
 }
 
diff --git a/libclamav/bytecode_api.c b/libclamav/bytecode_api.c
index b1f2c25..f71aef8 100644
--- a/libclamav/bytecode_api.c
+++ b/libclamav/bytecode_api.c
@@ -42,6 +42,7 @@
 #include "pe.h"
 #include "disasm.h"
 #include "scanners.h"
+#include "jsparse/js-norm.h"
 
 uint32_t cli_bcapi_test1(struct cli_bc_ctx *ctx, uint32_t a, uint32_t b)
 {
@@ -817,3 +818,80 @@ int32_t cli_bcapi_bytecode_rt_error(struct cli_bc_ctx *ctx , int32_t id)
     return 0;
 }
 
+int32_t cli_bcapi_jsnorm_init(struct cli_bc_ctx *ctx, int32_t from)
+{
+    struct parser_state *state;
+    struct bc_jsnorm *b;
+    unsigned  n = ctx->njsnorms + 1;
+    if (!get_buffer(ctx, from)) {
+	cli_dbgmsg("bytecode api: jsnorm_init: invalid buffers!\n");
+	return -1;
+    }
+    state = cli_js_init();
+    if (!state)
+	return -1;
+    b = cli_realloc(ctx->jsnorms, sizeof(*ctx->jsnorms)*n);
+    if (!b) {
+	cli_js_destroy(state);
+	return -1;
+    }
+    ctx->jsnorms = b;
+    ctx->njsnorms = n;
+    b = &b[n-1];
+    b->from = from;
+    b->state = state;
+    if (!ctx->jsnormdir) {
+	cli_ctx *cctx = (cli_ctx*)ctx->ctx;
+	ctx->jsnormdir = cli_gentemp(cctx ? cctx->engine->tmpdir : NULL);
+	if (ctx->jsnormdir) {
+	    if (mkdir(ctx->jsnormdir, 0700)) {
+		cli_dbgmsg("js: can't create temp dir %s\n", ctx->jsnormdir);
+		free(ctx->jsnormdir);
+		return CL_ETMPDIR;
+	    }
+	}
+    }
+    return n-1;
+}
+
+static struct bc_jsnorm *get_jsnorm(struct cli_bc_ctx *ctx, int32_t id)
+{
+    if (id < 0 || id >= ctx->njsnorms || !ctx->jsnorms)
+	return NULL;
+    return &ctx->jsnorms[id];
+}
+
+int32_t cli_bcapi_jsnorm_process(struct cli_bc_ctx *ctx, int32_t id)
+{
+    unsigned avail;
+    char *in;
+    cli_ctx *cctx = ctx->ctx;
+    struct bc_jsnorm *b = get_jsnorm(ctx, id);
+    if (!b || b->from == -1 || !b->state)
+	return -1;
+
+    avail = cli_bcapi_buffer_pipe_read_avail(ctx, b->from);
+    in = cli_bcapi_buffer_pipe_read_get(ctx, b->from, avail);
+    if (!avail || !in)
+	return -1;
+    if (cctx && cli_checklimits("bytecode js api", cctx, ctx->jsnormwritten + avail, 0, 0))
+	return -1;
+    cli_bcapi_buffer_pipe_read_stopped(ctx, b->from, avail);
+    cli_js_process_buffer(b->state, in, avail);
+    return 0;
+}
+
+int32_t cli_bcapi_jsnorm_done(struct cli_bc_ctx *ctx , int32_t id)
+{
+    struct bc_jsnorm *b = get_jsnorm(ctx, id);
+    if (!b || b->from == -1)
+	return -1;
+    if (ctx->ctx && cli_updatelimits(ctx->ctx, ctx->jsnormwritten))
+	return -1;
+    ctx->jsnormwritten = 0;
+    cli_js_parse_done(b->state);
+    cli_js_output(b->state, ctx->jsnormdir);
+    cli_js_destroy(b->state);
+    b->from = -1;
+    return 0;
+}
diff --git a/libclamav/bytecode_api.h b/libclamav/bytecode_api.h
index 78ad03e..1fc2d5b 100644
--- a/libclamav/bytecode_api.h
+++ b/libclamav/bytecode_api.h
@@ -247,5 +247,9 @@ int32_t inflate_done(int32_t id);
 
 int32_t bytecode_rt_error(int32_t locationid);
 
+int32_t jsnorm_init(int32_t from_buffer);
+int32_t jsnorm_process(int32_t id);
+int32_t jsnorm_done(int32_t id);
+
 #endif
 #endif
diff --git a/libclamav/bytecode_api_decl.c b/libclamav/bytecode_api_decl.c
index a14feae..aac273b 100644
--- a/libclamav/bytecode_api_decl.c
+++ b/libclamav/bytecode_api_decl.c
@@ -75,6 +75,9 @@ int32_t cli_bcapi_inflate_init(struct cli_bc_ctx *ctx , int32_t, int32_t, int32_
 int32_t cli_bcapi_inflate_process(struct cli_bc_ctx *ctx , int32_t);
 int32_t cli_bcapi_inflate_done(struct cli_bc_ctx *ctx , int32_t);
 int32_t cli_bcapi_bytecode_rt_error(struct cli_bc_ctx *ctx , int32_t);
+int32_t cli_bcapi_jsnorm_init(struct cli_bc_ctx *ctx , int32_t);
+int32_t cli_bcapi_jsnorm_process(struct cli_bc_ctx *ctx , int32_t);
+int32_t cli_bcapi_jsnorm_done(struct cli_bc_ctx *ctx , int32_t);
 
 const struct cli_apiglobal cli_globals[] = {
 /* Bytecode globals BEGIN */
@@ -187,7 +190,10 @@ const struct cli_apicall cli_apicalls[]={
 	{"inflate_init", 9, 0, 7},
 	{"inflate_process", 8, 13, 2},
 	{"inflate_done", 8, 14, 2},
-	{"bytecode_rt_error", 8, 15, 2}
+	{"bytecode_rt_error", 8, 15, 2},
+	{"jsnorm_init", 8, 16, 2},
+	{"jsnorm_process", 8, 17, 2},
+	{"jsnorm_done", 8, 18, 2}
 /* Bytecode APIcalls END */
 };
 const cli_apicall_int2 cli_apicalls0[] = {
@@ -230,7 +236,10 @@ const cli_apicall_int1 cli_apicalls2[] = {
 	(cli_apicall_int1)cli_bcapi_buffer_pipe_done,
 	(cli_apicall_int1)cli_bcapi_inflate_process,
 	(cli_apicall_int1)cli_bcapi_inflate_done,
-	(cli_apicall_int1)cli_bcapi_bytecode_rt_error
+	(cli_apicall_int1)cli_bcapi_bytecode_rt_error,
+	(cli_apicall_int1)cli_bcapi_jsnorm_init,
+	(cli_apicall_int1)cli_bcapi_jsnorm_process,
+	(cli_apicall_int1)cli_bcapi_jsnorm_done
 };
 const cli_apicall_malloclike cli_apicalls3[] = {
 	(cli_apicall_malloclike)cli_bcapi_malloc
diff --git a/libclamav/bytecode_api_impl.h b/libclamav/bytecode_api_impl.h
index f8f6997..2ce5471 100644
--- a/libclamav/bytecode_api_impl.h
+++ b/libclamav/bytecode_api_impl.h
@@ -72,5 +72,8 @@ int32_t cli_bcapi_inflate_init(struct cli_bc_ctx *ctx , int32_t, int32_t, int32_
 int32_t cli_bcapi_inflate_process(struct cli_bc_ctx *ctx , int32_t);
 int32_t cli_bcapi_inflate_done(struct cli_bc_ctx *ctx , int32_t);
 int32_t cli_bcapi_bytecode_rt_error(struct cli_bc_ctx *ctx , int32_t);
+int32_t cli_bcapi_jsnorm_init(struct cli_bc_ctx *ctx , int32_t);
+int32_t cli_bcapi_jsnorm_process(struct cli_bc_ctx *ctx , int32_t);
+int32_t cli_bcapi_jsnorm_done(struct cli_bc_ctx *ctx , int32_t);
 
 #endif
diff --git a/libclamav/bytecode_priv.h b/libclamav/bytecode_priv.h
index eca7660..3187308 100644
--- a/libclamav/bytecode_priv.h
+++ b/libclamav/bytecode_priv.h
@@ -132,6 +132,11 @@ struct bc_inflate {
     int8_t  needSync;
 };
 
+struct bc_jsnorm {
+    struct parser_state *state;
+    int32_t from;
+};
+
 struct cli_bc_ctx {
     uint8_t timeout;/* must be first byte in struct! */
     /* id and params of toplevel function called */
@@ -174,6 +179,10 @@ struct cli_bc_ctx {
     unsigned nbuffers;
     struct cli_hashset *hashsets;
     unsigned nhashsets;
+    struct bc_jsnorm* jsnorms;
+    unsigned njsnorms;
+    char *jsnormdir;
+    unsigned jsnormwritten;
 };
 struct cli_all_bc;
 int cli_vm_execute(const struct cli_bc *bc, struct cli_bc_ctx *ctx, const struct cli_bc_func *func, const struct cli_bc_inst *inst);

-- 
Debian repository for ClamAV



More information about the Pkg-clamav-commits mailing list