[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b

Tomasz Kojm tkojm at clamav.net
Sun Apr 4 00:59:15 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit a6a9845602a64c45d45a71d9c021f9a9a3060d24
Author: Tomasz Kojm <tkojm at clamav.net>
Date:   Tue Jul 28 20:23:31 2009 +0200

    libclamav: improve loading speed of compressed databases (bb#1105)

diff --git a/ChangeLog b/ChangeLog
index f854572..74f30c0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Tue Jul 28 20:19:08 CEST 2009 (tk)
+----------------------------------
+ * libclamav: improve loading speed of compressed databases (bb#1105)
+
 Mon Jul 27 13:53:15 CEST 2009 (tk)
 ----------------------------------
  * libclamav/macho.c: improve detection of Universal Binaries
diff --git a/libclamav/cvd.c b/libclamav/cvd.c
index 85df805..928e65e 100644
--- a/libclamav/cvd.c
+++ b/libclamav/cvd.c
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2007-2008 Sourcefire, Inc.
+ *  Copyright (C) 2007-2009 Sourcefire, Inc.
  *
  *  Authors: Tomasz Kojm
  *
@@ -41,6 +41,7 @@
 #include "str.h"
 #include "cvd.h"
 #include "readdb.h"
+#include "default.h"
 
 #define TAR_BLOCKSIZE 512
 
@@ -227,6 +228,17 @@ static int cli_tgzload(int fd, struct cl_engine *engine, unsigned int *signo, un
 	dbio.gzs = NULL;
     }
 
+    dbio.bufsize = CLI_DEFAULT_DBIO_BUFSIZE;
+    dbio.buf = cli_malloc(dbio.bufsize);
+    if(!dbio.buf) {
+	cli_errmsg("cli_tgzload: Can't allocate memory for dbio.buf\n");
+	CLOSE_DBIO;
+	return CL_EMALFDB;
+    }
+    dbio.bufpt = NULL;
+    dbio.usebuf = 1;
+    dbio.readpt = dbio.buf;
+
     while(1) {
 
 	if(compr)
@@ -239,6 +251,7 @@ static int cli_tgzload(int fd, struct cl_engine *engine, unsigned int *signo, un
 
 	if(nread != TAR_BLOCKSIZE) {
 	    cli_errmsg("cli_tgzload: Incomplete block read\n");
+	    free(dbio.buf);
 	    CLOSE_DBIO;
 	    return CL_EMALFDB;
 	}
@@ -251,6 +264,7 @@ static int cli_tgzload(int fd, struct cl_engine *engine, unsigned int *signo, un
 
 	if(strchr(name, '/')) {
 	    cli_errmsg("cli_tgzload: Slash separators are not allowed in CVD\n");
+	    free(dbio.buf);
 	    CLOSE_DBIO;
 	    return CL_EMALFDB;
 	}
@@ -263,10 +277,12 @@ static int cli_tgzload(int fd, struct cl_engine *engine, unsigned int *signo, un
 		break;
 	    case '5':
 		cli_errmsg("cli_tgzload: Directories are not supported in CVD\n");
+		free(dbio.buf);
 		CLOSE_DBIO;
 		return CL_EMALFDB;
 	    default:
 		cli_errmsg("cli_tgzload: Unknown type flag '%c'\n", type);
+		free(dbio.buf);
 		CLOSE_DBIO;
 		return CL_EMALFDB;
 	}
@@ -276,10 +292,14 @@ static int cli_tgzload(int fd, struct cl_engine *engine, unsigned int *signo, un
 
 	if((sscanf(osize, "%o", &size)) == 0) {
 	    cli_errmsg("cli_tgzload: Invalid size in header\n");
+	    free(dbio.buf);
 	    CLOSE_DBIO;
 	    return CL_EMALFDB;
 	}
 	dbio.size = size;
+	dbio.readsize = dbio.size < dbio.bufsize ? dbio.size : dbio.bufsize - 1;
+	dbio.bufpt = NULL;
+	dbio.readpt = dbio.buf;
 
 	/* cli_dbgmsg("cli_tgzload: Loading %s, size: %u\n", name, size); */
 	if(compr)
@@ -291,6 +311,7 @@ static int cli_tgzload(int fd, struct cl_engine *engine, unsigned int *signo, un
 	    ret = cli_load(name, engine, signo, options, &dbio);
 	    if(ret) {
 		cli_errmsg("cli_tgzload: Can't load %s\n", name);
+		free(dbio.buf);
 		CLOSE_DBIO;
 		return CL_EMALFDB;
 	    }
@@ -309,6 +330,7 @@ static int cli_tgzload(int fd, struct cl_engine *engine, unsigned int *signo, un
 	}
     }
 
+    free(dbio.buf);
     CLOSE_DBIO;
     return CL_SUCCESS;
 }
diff --git a/libclamav/cvd.h b/libclamav/cvd.h
index 9d97516..53681e3 100644
--- a/libclamav/cvd.h
+++ b/libclamav/cvd.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2007-2008 Sourcefire, Inc.
+ *  Copyright (C) 2007-2009 Sourcefire, Inc.
  *
  *  Authors: Tomasz Kojm
  *
@@ -29,6 +29,9 @@ struct cli_dbio {
     gzFile *gzs;
     FILE *fs;
     unsigned int size;
+    char *buf, *bufpt, *readpt;
+    unsigned int usebuf, bufsize, readsize;
+
 };
 
 int cli_cvdload(FILE *fs, struct cl_engine *engine, unsigned int *signo, unsigned int daily, unsigned int options, unsigned int cld);
diff --git a/libclamav/default.h b/libclamav/default.h
index 4684f99..8641fe9 100644
--- a/libclamav/default.h
+++ b/libclamav/default.h
@@ -26,6 +26,7 @@
 #define CLI_DEFAULT_AC_TRACKLEN	    8
 
 #define CLI_DEFAULT_LSIG_BUFSIZE    32768
+#define CLI_DEFAULT_DBIO_BUFSIZE    CLI_DEFAULT_LSIG_BUFSIZE + 1
 
 #define CLI_DEFAULT_MAXSCANSIZE	    104857600
 #define CLI_DEFAULT_MAXFILESIZE	    26214400
diff --git a/libclamav/readdb.c b/libclamav/readdb.c
index 5ac1457..ae5e64b 100644
--- a/libclamav/readdb.c
+++ b/libclamav/readdb.c
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2007-2008 Sourcefire, Inc.
+ *  Copyright (C) 2007-2009 Sourcefire, Inc.
  *
  *  Authors: Tomasz Kojm
  *
@@ -340,10 +340,68 @@ static int cli_initroots(struct cl_engine *engine, unsigned int options)
 
 char *cli_dbgets(char *buff, unsigned int size, FILE *fs, struct cli_dbio *dbio)
 {
-    if(fs) {
+    if(fs)
 	return fgets(buff, size, fs);
 
-    } else {
+    if(dbio->usebuf) {
+	    int bread;
+	    char *nl;
+
+	while(1) {
+	    if(!dbio->bufpt) {
+		if(!dbio->size)
+		    return NULL;
+
+		if(dbio->gzs) {
+		    bread = gzread(dbio->gzs, dbio->readpt, dbio->readsize);
+		    if(bread == -1) {
+			cli_errmsg("cli_dbgets: gzread() failed\n");
+			return NULL;
+		    }
+		} else {
+		    bread = fread(dbio->readpt, 1, dbio->readsize, dbio->fs);
+		    if(!bread && ferror(dbio->fs)) {
+			cli_errmsg("cli_dbgets: gzread() failed\n");
+			return NULL;
+		    }
+		}
+		if(!bread)
+		    return NULL;
+		dbio->readpt[bread] = 0;
+		dbio->bufpt = dbio->buf;
+		dbio->size -= bread;
+	    }
+	    nl = strchr(dbio->bufpt, '\n');
+	    if(nl) {
+		if(nl - dbio->bufpt >= size) {
+		    cli_errmsg("cli_dbgets: Line too long for provided buffer\n");
+		    return NULL;
+		}
+		strncpy(buff, dbio->bufpt, nl - dbio->bufpt);
+		buff[nl - dbio->bufpt] = 0;
+		if(nl < dbio->buf + dbio->bufsize) {
+		    dbio->bufpt = ++nl;
+		} else {
+		    dbio->bufpt = NULL;
+		    dbio->readpt = dbio->buf;
+		    dbio->readsize = dbio->size < dbio->bufsize ? dbio->size : dbio->bufsize - 1;
+		}
+		return buff;
+	    } else {
+		    unsigned int remain = dbio->buf + dbio->bufsize - 1 - dbio->bufpt;
+
+		if(dbio->bufpt == dbio->buf) {
+		    cli_errmsg("cli_dbgets: Invalid data or internal buffer too small\n");
+		    return NULL;
+		}
+		memmove(dbio->buf, dbio->bufpt, remain);
+		dbio->readpt = dbio->buf + remain;
+		dbio->readsize = dbio->bufsize - remain;
+		dbio->readsize = dbio->size < dbio->bufsize - remain ? dbio->size : dbio->bufsize - remain - 1;
+		dbio->bufpt = NULL;
+	    }
+	}
+    } else { /* use gzgets/fgets */
 	    char *pt;
 	    unsigned int bs;
 

-- 
Debian repository for ClamAV



More information about the Pkg-clamav-commits mailing list