[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b
aCaB
acab at clamav.net
Sun Apr 4 01:10:43 UTC 2010
The following commit has been merged in the debian/unstable branch:
commit 73d8cdedea111c4908e8fe0ba2ea26a59b09f0f3
Author: aCaB <acab at clamav.net>
Date: Mon Dec 7 18:54:09 2009 +0100
load idb
diff --git a/libclamav/others.h b/libclamav/others.h
index 62b26d4..d834c6d 100644
--- a/libclamav/others.h
+++ b/libclamav/others.h
@@ -114,7 +114,6 @@ typedef struct {
} cli_ctx;
struct icomtr {
- unsigned int size;
unsigned int color_avg[3];
unsigned int color_x[3];
unsigned int color_y[3];
@@ -205,7 +204,8 @@ struct cl_engine {
char *pua_cats;
/* Icon reference storage */
- struct icomtr *icons;
+ struct icomtr *icons[3];
+ unsigned int icon_counts[3];
/* Used for memory pools */
mpool_t *mempool;
diff --git a/libclamav/pe_icons.c b/libclamav/pe_icons.c
index 208d1f8..2072d90 100644
--- a/libclamav/pe_icons.c
+++ b/libclamav/pe_icons.c
@@ -37,82 +37,6 @@
#define LABDIFF(x) labdiff2(x)
#endif
-static const struct icomtr reference[3] = {
- {
- /* 32x32x32 */
- 32,
- { 2923, 2746, 945 }, /* col avg */
- { 13, 0, 17 }, /* col x */
- { 3, 3, 15 }, /* col y */
- { 0, 0, 0 }, /* gray avg */
- { 22, 22, 0 }, /* gray x */
- { 0, 8, 12 }, /* gray y */
- { 255, 255, 251 }, /* bright avg */
- { 0, 0, 10 }, /* bright x */
- { 13, 21, 16 }, /* bright y */
- { 158, 184, 205 }, /* dark avg */
- { 17, 16, 0 }, /* dark x */
- { 23, 4, 5 }, /* dark y */
- { 105, 94, 73 }, /* edge avg */
- { 15, 5, 15 }, /* edge x */
- { 2, 2, 21 }, /* edge y */
- { 2, 2, 13 }, /* noedge avg */
- { 0, 0, 21 }, /* noedge x */
- { 23, 15, 12 }, /* noedge y */
- 99, 0, 0, 20,
- "PDF.ICON.32x32"
- },
- {
- /* 24x24x32 */
- 24,
- { 2940, 2722, 904 }, /* col avg */
- { 10, 1, 11 }, /* col x */
- { 2, 2, 11 }, /* col y */
- { 0, 0, 0 }, /* gray avg */
- { 0, 6, 16 }, /* gray x */
- { 9, 9, 9 }, /* gray y */
- { 252, 251, 251 }, /* bright avg */
- { 6, 0, 10 }, /* bright x */
- { 17, 10, 16 }, /* bright y */
- { 183, 184, 210 }, /* dark avg */
- { 13, 11, 1 }, /* dark x */
- { 16, 3, 4 }, /* dark y */
- { 137, 127, 76 }, /* edge avg */
- { 11, 1, 13 }, /* edge x */
- { 2, 3, 16 }, /* edge y */
- { 6, 14, 14 }, /* noedge avg */
- { 0, 6, 16 }, /* noedge x */
- { 15, 11, 9 }, /* noedge y */
- 99, 0, 0, 22,
- "PDF.ICON.24x24"
- },
- {
- /* 16x16x32 */
- 16,
- { 3403, 3347, 1567 }, /* col avg */
- { 0, 4, 8 }, /* col x */
- { 2, 2, 2 }, /* col y */
- { 0, 0, 0 }, /* gray avg */
- { 10, 10, 0 }, /* gray x */
- { 0, 4, 6 }, /* gray y */
- { 253, 253, 249 }, /* bright avg */
- { 4, 10, 6 }, /* bright x */
- { 11, 11, 7 }, /* bright y */
- { 163, 190, 235 }, /* dark avg */
- { 7, 3, 3 }, /* dark x */
- { 2, 2, 6 }, /* dark y */
- { 124, 111, 69 }, /* edge avg */
- { 7, 3, 2 }, /* edge x */
- { 1, 1, 5 }, /* edge y */
- { 17, 20, 26 }, /* noedge avg */
- { 9, 0, 4 }, /* noedge x */
- { 11, 9, 8 }, /* noedge y */
- 100, 0, 0, 20,
- "PDF.ICON.16x16"
- }
-
-};
-
struct GICONS {
unsigned int cnt;
uint32_t lastg;
@@ -1119,6 +1043,49 @@ static int getmetrics(unsigned int side, unsigned int *imagedata, struct icomtr
cli_dbgmsg("edge areas: %u@(%u,%u) %u@(%u,%u) %u@(%u,%u)\n", res->edge_avg[0], res->edge_x[0], res->edge_y[0], res->edge_avg[1], res->edge_x[1], res->edge_y[1], res->edge_avg[2], res->edge_x[2], res->edge_y[2]);
cli_dbgmsg("noedge areas: %u@(%u,%u) %u@(%u,%u) %u@(%u,%u)\n", res->noedge_avg[0], res->noedge_x[0], res->noedge_y[0], res->noedge_avg[1], res->noedge_x[1], res->noedge_y[1], res->noedge_avg[2], res->noedge_x[2], res->noedge_y[2]);
+
+ if(cli_debug_flag) {
+#define ICOSIGSZ (2 + (3 + 2 + 2) * 3 * 2 + (2 + 2 + 2) * 3 * 4 + 2 + 2 + 2 + 2)
+ char mstr[ICOSIGSZ + 1], *ptr = mstr;
+
+ sprintf(ptr, "%02x", side); ptr+=2;
+ for(i=0; i<3; i++) {
+ sprintf(ptr, "%03x", res->color_avg[i]); ptr+=3;
+ sprintf(ptr, "%02x", res->color_x[i]); ptr+=2;
+ sprintf(ptr, "%02x", res->color_y[i]); ptr+=2;
+ }
+ for(i=0; i<3; i++) {
+ sprintf(ptr, "%03x", res->gray_avg[i]); ptr+=3;
+ sprintf(ptr, "%02x", res->gray_x[i]); ptr+=2;
+ sprintf(ptr, "%02x", res->gray_y[i]); ptr+=2;
+ }
+ for(i=0; i<3; i++) {
+ sprintf(ptr, "%02x", res->bright_avg[i]); ptr+=2;
+ sprintf(ptr, "%02x", res->bright_x[i]); ptr+=2;
+ sprintf(ptr, "%02x", res->bright_y[i]); ptr+=2;
+ }
+ for(i=0; i<3; i++) {
+ sprintf(ptr, "%02x", res->dark_avg[i]); ptr+=2;
+ sprintf(ptr, "%02x", res->dark_x[i]); ptr+=2;
+ sprintf(ptr, "%02x", res->dark_y[i]); ptr+=2;
+ }
+ for(i=0; i<3; i++) {
+ sprintf(ptr, "%02x", res->edge_avg[i]); ptr+=2;
+ sprintf(ptr, "%02x", res->edge_x[i]); ptr+=2;
+ sprintf(ptr, "%02x", res->edge_y[i]); ptr+=2;
+ }
+ for(i=0; i<3; i++) {
+ sprintf(ptr, "%02x", res->noedge_avg[i]); ptr+=2;
+ sprintf(ptr, "%02x", res->noedge_x[i]); ptr+=2;
+ sprintf(ptr, "%02x", res->noedge_y[i]); ptr+=2;
+ }
+ sprintf(ptr, "%02x", res->rsum); ptr+=2;
+ sprintf(ptr, "%02x", res->gsum); ptr+=2;
+ sprintf(ptr, "%02x", res->bsum);
+ cli_dbgmsg("ICO SIGNATURE: ICON.NAME:%s\n", mstr);
+
+ }
+
return CL_CLEAN;
}
@@ -1142,7 +1109,7 @@ static int parseicon(uint32_t rva, cli_ctx *ctx, struct cli_exe_section *exe_sec
uint32_t *palette = NULL, *imagedata;
unsigned int scanlinesz, andlinesz;
unsigned int width, height, depth, x, y;
- unsigned int err, scalemode = 2;
+ unsigned int err, scalemode = 2, enginesize;
fmap_t *map = *ctx->fmap;
uint32_t icoff = cli_rawaddr(rva, exe_sections, nsections, &err, map->len, hdr_size);
@@ -1370,49 +1337,49 @@ static int parseicon(uint32_t rva, cli_ctx *ctx, struct cli_exe_section *exe_sec
getmetrics(width, imagedata, &metrics);
- for(x=0; x<sizeof(reference) / sizeof(reference[0]); x++) {
- if(reference[x].size == width) {
- unsigned int color = matchpoint(width, metrics.color_x, metrics.color_y, metrics.color_avg, reference[x].color_x, reference[x].color_y, reference[x].color_avg, 4072);
- unsigned int gray = matchpoint(width, metrics.gray_x, metrics.gray_y, metrics.gray_avg, reference[x].gray_x, reference[x].gray_y, reference[x].gray_avg, 4072);
- unsigned int bright = matchpoint(width, metrics.bright_x, metrics.bright_y, metrics.bright_avg, reference[x].bright_x, reference[x].bright_y, reference[x].bright_avg, 255);
- unsigned int dark = matchpoint(width, metrics.dark_x, metrics.dark_y, metrics.dark_avg, reference[x].dark_x, reference[x].dark_y, reference[x].dark_avg, 255);
- unsigned int edge = matchpoint(width, metrics.edge_x, metrics.edge_y, metrics.edge_avg, reference[x].edge_x, reference[x].edge_y, reference[x].edge_avg, 255);
- unsigned int noedge = matchpoint(width, metrics.noedge_x, metrics.noedge_y, metrics.noedge_avg, reference[x].noedge_x, reference[x].noedge_y, reference[x].noedge_avg, 255);
- unsigned int reds = abs((int)metrics.rsum - (int)reference[x].rsum) * 10;
- unsigned int greens = abs((int)metrics.gsum - (int)reference[x].gsum) * 10;
- unsigned int blues = abs((int)metrics.bsum - (int)reference[x].bsum) * 10;
- unsigned int ccount = abs((int)metrics.ccount - (int)reference[x].ccount) * 10;
- unsigned int colors, used = 6, confidence;
-
- reds = (reds < 100) * (100 - reds);
- greens = (greens < 100) * (100 - greens);
- blues = (blues < 100) * (100 - blues);
- ccount = (ccount < 100) * (100 - ccount);
- colors = (reds + greens + blues + ccount) / 4;
-
- if(!metrics.ccount && !reference[x].ccount) {
- colors = 0;
- used--;
- }
- cli_dbgmsg("color confidence: %u%%\n", color);
- cli_dbgmsg("gray confidence: %u%%\n", gray);
- cli_dbgmsg("bright confidence: %u%%\n", bright);
- cli_dbgmsg("dark confidence: %u%%\n", dark);
- cli_dbgmsg("edge confidence: %u%%\n", edge);
- cli_dbgmsg("noedge confidence: %u%%\n", noedge);
- cli_dbgmsg("spread confidence: red %u%%, green %u%%, blue %u%% - colors %u%%\n", reds, greens, blues, ccount);
-
- confidence = (color + gray*2/3 + bright*2/3 + dark + edge + noedge*2/3 + colors) / used;
- if(confidence > 65) {
- cli_warnmsg("confidence: %u\n", confidence);
- if(ctx->virname)
- *ctx->virname = reference[x].name;
- return CL_VIRUS;
- }
+ enginesize = (width >> 3) - 2;
+ for(x=0; x<ctx->engine->icon_counts[enginesize]; x++) {
+ unsigned int color = matchpoint(width, metrics.color_x, metrics.color_y, metrics.color_avg, ctx->engine->icons[enginesize][x].color_x, ctx->engine->icons[enginesize][x].color_y, ctx->engine->icons[enginesize][x].color_avg, 4072);
+ unsigned int gray = matchpoint(width, metrics.gray_x, metrics.gray_y, metrics.gray_avg, ctx->engine->icons[enginesize][x].gray_x, ctx->engine->icons[enginesize][x].gray_y, ctx->engine->icons[enginesize][x].gray_avg, 4072);
+ unsigned int bright = matchpoint(width, metrics.bright_x, metrics.bright_y, metrics.bright_avg, ctx->engine->icons[enginesize][x].bright_x, ctx->engine->icons[enginesize][x].bright_y, ctx->engine->icons[enginesize][x].bright_avg, 255);
+ unsigned int dark = matchpoint(width, metrics.dark_x, metrics.dark_y, metrics.dark_avg, ctx->engine->icons[enginesize][x].dark_x, ctx->engine->icons[enginesize][x].dark_y, ctx->engine->icons[enginesize][x].dark_avg, 255);
+ unsigned int edge = matchpoint(width, metrics.edge_x, metrics.edge_y, metrics.edge_avg, ctx->engine->icons[enginesize][x].edge_x, ctx->engine->icons[enginesize][x].edge_y, ctx->engine->icons[enginesize][x].edge_avg, 255);
+ unsigned int noedge = matchpoint(width, metrics.noedge_x, metrics.noedge_y, metrics.noedge_avg, ctx->engine->icons[enginesize][x].noedge_x, ctx->engine->icons[enginesize][x].noedge_y, ctx->engine->icons[enginesize][x].noedge_avg, 255);
+ unsigned int reds = abs((int)metrics.rsum - (int)ctx->engine->icons[enginesize][x].rsum) * 10;
+ unsigned int greens = abs((int)metrics.gsum - (int)ctx->engine->icons[enginesize][x].gsum) * 10;
+ unsigned int blues = abs((int)metrics.bsum - (int)ctx->engine->icons[enginesize][x].bsum) * 10;
+ unsigned int ccount = abs((int)metrics.ccount - (int)ctx->engine->icons[enginesize][x].ccount) * 10;
+ unsigned int colors, used = 6, confidence;
+
+ reds = (reds < 100) * (100 - reds);
+ greens = (greens < 100) * (100 - greens);
+ blues = (blues < 100) * (100 - blues);
+ ccount = (ccount < 100) * (100 - ccount);
+ colors = (reds + greens + blues + ccount) / 4;
+
+ if(!metrics.ccount && !ctx->engine->icons[enginesize][x].ccount) {
+ colors = 0;
+ used--;
+ }
- /* CURRENTLY >=60% IS A MATCH */
+ cli_dbgmsg("color confidence: %u%%\n", color);
+ cli_dbgmsg("gray confidence: %u%%\n", gray);
+ cli_dbgmsg("bright confidence: %u%%\n", bright);
+ cli_dbgmsg("dark confidence: %u%%\n", dark);
+ cli_dbgmsg("edge confidence: %u%%\n", edge);
+ cli_dbgmsg("noedge confidence: %u%%\n", noedge);
+ cli_dbgmsg("spread confidence: red %u%%, green %u%%, blue %u%% - colors %u%%\n", reds, greens, blues, ccount);
+
+ confidence = (color + gray*2/3 + bright*2/3 + dark + edge + noedge*2/3 + colors) / used;
+ if(confidence > 65) {
+ cli_warnmsg("confidence: %u\n", confidence);
+ if(ctx->virname)
+ *ctx->virname = ctx->engine->icons[enginesize][x].name;
+ return CL_VIRUS;
}
+
+ /* CURRENTLY >=60% IS A MATCH */
}
free(imagedata);
diff --git a/libclamav/readdb.c b/libclamav/readdb.c
index 9c6e238..5eb59a0 100644
--- a/libclamav/readdb.c
+++ b/libclamav/readdb.c
@@ -521,52 +521,186 @@ static int cli_loaddb(FILE *fs, struct cl_engine *engine, unsigned int *signo, u
return CL_SUCCESS;
}
-#define ICO_TOKENS 9
-/* static int cli_loadico(FILE *fs, struct cl_engine *engine, unsigned int *signo, unsigned int mode, unsigned int options, struct cli_dbio *dbio, const char *dbname) */
-/* { */
-/* const char *tokens[ICO_TOKENS + 1]; */
-/* char buffer[FILEBUFF], *buffer_cpy; */
-/* const char *pt; */
-/* int ret = CL_SUCCESS; */
-/* unsigned int size_field = 1, md5_field = 0, line = 0, sigs = 0, tokens_count; */
-
-
-/* if(engine->ignored) */
-/* if(!(buffer_cpy = cli_malloc(FILEBUFF))) */
-/* return CL_EMEM; */
-
-/* while(cli_dbgets(buffer, FILEBUFF, fs, dbio)) { */
-/* line++; */
-/* cli_chomp(buffer); */
-/* if(engine->ignored) */
-/* strcpy(buffer_cpy, buffer); */
-
-/* tokens_count = cli_strtokenize(buffer, ':', ICO_TOKENS + 1, tokens); */
-/* if(tokens_count != ICO_TOKENS) { */
-/* ret = CL_EMALFDB; */
-/* break; */
-/* } */
-
-/* sigs++; */
-/* } */
-/* if(engine->ignored) */
-/* free(buffer_cpy); */
-
-/* if(!line) { */
-/* cli_errmsg("cli_loadmd5: Empty database file\n"); */
-/* return CL_EMALFDB; */
-/* } */
-
-/* if(ret) { */
-/* cli_errmsg("cli_loadmd5: Problem parsing database at line %u\n", line); */
-/* return ret; */
-/* } */
-
-/* if(signo) */
-/* *signo += sigs; */
-
-/* return CL_SUCCESS; */
-/* } */
+#define ICO_TOKENS 2
+static int cli_loadidb(FILE *fs, struct cl_engine *engine, unsigned int *signo, unsigned int options, struct cli_dbio *dbio, const char *dbname)
+{
+ const char *tokens[ICO_TOKENS + 1];
+ char buffer[FILEBUFF], *buffer_cpy;
+ uint8_t *pt, *hash;
+ int ret = CL_SUCCESS;
+ unsigned int line = 0, sigs = 0, tokens_count, i, size;
+ struct icomtr *metric;
+
+ if(engine->ignored)
+ if(!(buffer_cpy = cli_malloc(FILEBUFF)))
+ return CL_EMEM;
+
+ while(cli_dbgets(buffer, FILEBUFF, fs, dbio)) {
+ line++;
+ cli_chomp(buffer);
+ if(engine->ignored)
+ strcpy(buffer_cpy, buffer);
+
+ tokens_count = cli_strtokenize(buffer, ':', ICO_TOKENS + 1, tokens);
+ if(tokens_count != ICO_TOKENS) {
+ ret = CL_EMALFDB;
+ break;
+ }
+
+ if(strlen(tokens[1]) != 122) {
+ ret = CL_EMALFDB;
+ break;
+ }
+
+ if(engine->ignored && cli_chkign(engine->ignored, tokens[0], buffer_cpy))
+ continue;
+
+ hash = tokens[1];
+ if(cli_hexnibbles(hash, 122)) {
+ cli_errmsg("cli_loadidb: Malformed hash at line %u (bad chars)\n", line);
+ ret = CL_EMALFDB;
+ break;
+ }
+ size = (hash[0] << 4) + hash[1];
+ if(size != 32 && size != 24 && size != 16) {
+ cli_errmsg("cli_loadidb: Malformed hash at line %u (bad size)\n", line);
+ ret = CL_EMALFDB;
+ break;
+ }
+ size = (size >> 3) - 2;
+ hash+=2;
+
+ metric = (struct icomtr *) mpool_realloc(engine->mempool, engine->icons[size], sizeof(struct icomtr) * (engine->icon_counts[size] + 1));
+ if(!metric) {
+ ret = CL_EMEM;
+ break;
+ }
+
+ engine->icons[size] = metric;
+ metric += engine->icon_counts[size];
+ engine->icon_counts[size]++;
+
+ for(i=0; i<3; i++) {
+ if((metric->color_avg[i] = (hash[0] << 8) | (hash[1] << 4) | hash[2]) > 4072)
+ break;
+ if((metric->color_x[i] = (hash[3] << 4) | hash[4]) > size - size / 8)
+ break;
+ if((metric->color_y[i] = (hash[5] << 4) | hash[6]) > size - size / 8)
+ break;
+ hash += 7;
+ }
+ if(i!=3) {
+ cli_errmsg("cli_loadidb: Malformed hash at line %u (bad color data)\n", line);
+ ret = CL_EMALFDB;
+ break;
+ }
+
+ for(i=0; i<3; i++) {
+ if((metric->gray_avg[i] = (hash[0] << 8) | (hash[1] << 4) | hash[2]) > 4072)
+ break;
+ if((metric->gray_x[i] = (hash[3] << 4) | hash[4]) > size - size / 8)
+ break;
+ if((metric->gray_y[i] = (hash[5] << 4) | hash[6]) > size - size / 8)
+ break;
+ hash += 7;
+ }
+ if(i!=3) {
+ cli_errmsg("cli_loadidb: Malformed hash at line %u (bad gray data)\n", line);
+ ret = CL_EMALFDB;
+ break;
+ }
+
+ for(i=0; i<3; i++) {
+ metric->bright_avg[i] = (hash[0] << 4) | hash[1];
+ if((metric->bright_x[i] = (hash[2] << 4) | hash[3]) > size - size / 8)
+ break;
+ if((metric->bright_y[i] = (hash[6] << 4) | hash[5]) > size - size / 8)
+ break;
+ hash += 6;
+ }
+ if(i!=3) {
+ cli_errmsg("cli_loadidb: Malformed hash at line %u (bad bright data)\n", line);
+ ret = CL_EMALFDB;
+ break;
+ }
+
+ for(i=0; i<3; i++) {
+ metric->dark_avg[i] = (hash[0] << 4) | hash[1];
+ if((metric->dark_x[i] = (hash[2] << 4) | hash[3]) > size - size / 8)
+ break;
+ if((metric->dark_y[i] = (hash[6] << 4) | hash[5]) > size - size / 8)
+ break;
+ hash += 6;
+ }
+ if(i!=3) {
+ cli_errmsg("cli_loadidb: Malformed hash at line %u (bad dark data)\n", line);
+ ret = CL_EMALFDB;
+ break;
+ }
+
+ for(i=0; i<3; i++) {
+ metric->edge_avg[i] = (hash[0] << 4) | hash[1];
+ if((metric->edge_x[i] = (hash[2] << 4) | hash[3]) > size - size / 8)
+ break;
+ if((metric->edge_y[i] = (hash[6] << 4) | hash[5]) > size - size / 8)
+ break;
+ hash += 6;
+ }
+ if(i!=3) {
+ cli_errmsg("cli_loadidb: Malformed hash at line %u (bad edge data)\n", line);
+ ret = CL_EMALFDB;
+ break;
+ }
+
+ for(i=0; i<3; i++) {
+ metric->noedge_avg[i] = (hash[0] << 4) | hash[1];
+ if((metric->noedge_x[i] = (hash[2] << 4) | hash[3]) > size - size / 8)
+ break;
+ if((metric->noedge_y[i] = (hash[6] << 4) | hash[5]) > size - size / 8)
+ break;
+ hash += 6;
+ }
+ if(i!=3) {
+ cli_errmsg("cli_loadidb: Malformed hash at line %u (bad noedge data)\n", line);
+ ret = CL_EMALFDB;
+ break;
+ }
+
+ metric->rsum = (hash[0] << 4) | hash[1];
+ metric->gsum = (hash[2] << 4) | hash[3];
+ metric->bsum = (hash[4] << 4) | hash[5];
+ metric->ccount = (hash[6] << 4) | hash[7];
+ if(metric->rsum + metric->gsum + metric->bsum > 100 || metric->ccount > 100) {
+ cli_errmsg("cli_loadidb: Malformed hash at line %u (bad spread data)\n", line);
+ ret = CL_EMALFDB;
+ break;
+ }
+
+ if(!(metric->name = cli_mpool_strdup(engine->mempool, tokens[0]))) {
+ ret = CL_EMEM;
+ break;
+ }
+
+ sigs++;
+ }
+ if(engine->ignored)
+ free(buffer_cpy);
+
+ if(!line) {
+ cli_errmsg("cli_loadmd5: Empty database file\n");
+ return CL_EMALFDB;
+ }
+
+ if(ret) {
+ cli_errmsg("cli_loadmd5: Problem parsing database at line %u\n", line);
+ return ret;
+ }
+
+ if(signo)
+ *signo += sigs;
+
+ return CL_SUCCESS;
+}
static int cli_loadwdb(FILE *fs, struct cl_engine *engine, unsigned int options, struct cli_dbio *dbio)
{
diff --git a/libclamav/str.c b/libclamav/str.c
index 8097026..da1d61e 100644
--- a/libclamav/str.c
+++ b/libclamav/str.c
@@ -582,3 +582,13 @@ int cli_textbuffer_append_normalize(struct text_buffer *buf, const char *str, si
return 0;
}
+int cli_hexnibbles(char *str, int len)
+{
+ int i;
+ for(i=0; i<len; i++) {
+ int c = cli_hex2int(str[i]);
+ if(c<0) return 1;
+ str[i] = c;
+ }
+ return 0;
+}
diff --git a/libclamav/str.h b/libclamav/str.h
index 3fcb29e..8641143 100644
--- a/libclamav/str.h
+++ b/libclamav/str.h
@@ -49,5 +49,6 @@ int cli_isnumber(const char *str);
char *cli_unescape(const char *str);
struct text_buffer;
int cli_textbuffer_append_normalize(struct text_buffer *buf, const char *str, size_t len);
+int cli_hexnibbles(char *str, int len);
#endif
--
Debian repository for ClamAV
More information about the Pkg-clamav-commits
mailing list