optimize loading of .ndb files (bb#339)

git-svn: trunk@2970
remotes/push_mirror/metadata
Tomasz Kojm 19 years ago
parent e70fc970af
commit e4e8366f9d
  1. 4
      ChangeLog
  2. 44
      libclamav/readdb.c
  3. 21
      libclamav/str.c
  4. 3
      libclamav/str.h

@ -1,3 +1,7 @@
Mon Mar 26 13:05:01 CEST 2007 (tk)
----------------------------------
* libclamav: optimize loading of .ndb files (bb#339), patch from Edwin
Sat Mar 24 15:01:50 CET 2007 (acab)
-----------------------------------
* libclamav/upx.c: improve upx rebuilder - more to come

@ -704,9 +704,12 @@ static int cli_loadpdb(FILE *fd, struct cl_engine **engine, unsigned int options
}
#endif
#define NDB_TOKENS 6
static int cli_loadndb(FILE *fd, struct cl_engine **engine, unsigned int *signo, unsigned short sdb, unsigned int options)
{
char buffer[FILEBUFF], *sig, *virname, *offset, *pt;
const char *tokens[NDB_TOKENS];
char buffer[FILEBUFF];
const char *sig, *virname, *offset, *pt;
struct cli_matcher *root;
int line = 0, sigs = 0, ret = 0;
unsigned short target;
@ -736,15 +739,15 @@ static int cli_loadndb(FILE *fd, struct cl_engine **engine, unsigned int *signo,
sigs++;
cli_chomp(buffer);
if(!(virname = cli_strtok(buffer, 0, ":"))) {
cli_strtokenize(buffer, ':', NDB_TOKENS, tokens);
if(!(virname = tokens[0])) {
ret = CL_EMALFDB;
break;
}
if((pt = cli_strtok(buffer, 4, ":"))) { /* min version */
if((pt = tokens[4])) { /* min version */
if(!isdigit(*pt)) {
free(virname);
free(pt);
ret = CL_EMALFDB;
break;
}
@ -752,79 +755,56 @@ static int cli_loadndb(FILE *fd, struct cl_engine **engine, unsigned int *signo,
if((unsigned int) atoi(pt) > cl_retflevel()) {
cli_dbgmsg("Signature for %s not loaded (required f-level: %d)\n", virname, atoi(pt));
sigs--;
free(virname);
free(pt);
continue;
}
free(pt);
if((pt = cli_strtok(buffer, 5, ":"))) { /* max version */
if((pt = tokens[5])) { /* max version */
if(!isdigit(*pt)) {
free(virname);
free(pt);
ret = CL_EMALFDB;
break;
}
if((unsigned int) atoi(pt) < cl_retflevel()) {
sigs--;
free(virname);
free(pt);
continue;
}
free(pt);
}
}
if(!(pt = cli_strtok(buffer, 1, ":")) || !isdigit(*pt)) {
free(virname);
if(pt)
free(pt);
if(!(pt = tokens[1]) || !isdigit(*pt)) {
ret = CL_EMALFDB;
break;
}
target = (unsigned short) atoi(pt);
free(pt);
if(target >= CL_TARGET_TABLE_SIZE) {
cli_dbgmsg("Not supported target type in signature for %s\n", virname);
sigs--;
free(virname);
continue;
}
root = (*engine)->root[target];
if(!(offset = cli_strtok(buffer, 2, ":"))) {
free(virname);
if(!(offset = tokens[2])) {
ret = CL_EMALFDB;
break;
} else if(!strcmp(offset, "*")) {
free(offset);
offset = NULL;
}
if(!(sig = cli_strtok(buffer, 3, ":"))) {
free(virname);
free(offset);
if(!(sig = tokens[3])) {
ret = CL_EMALFDB;
break;
}
if((ret = cli_parse_add(root, virname, sig, 0, offset, target))) {
cli_errmsg("Problem parsing signature at line %d\n", line);
free(virname);
free(offset);
free(sig);
ret = CL_EMALFDB;
break;
}
free(virname);
free(offset);
free(sig);
}
if(!line) {

@ -1,6 +1,7 @@
/*
* Copyright (C) 2002 - 2005 Tomasz Kojm <tkojm@clamav.net>
* cli_strrcpy(): Copyright (C) 2002 Nigel Horne <njh@bandsman.co.uk>
* cli_strtokenize(): Copyright (C) 2007 Edwin Torok <edwin@clamav.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -28,6 +29,7 @@
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include "clamav.h"
#include "others.h"
@ -370,3 +372,22 @@ char *cli_strrcpy(char *dest, const char *source) /* by NJH */
return --dest;
}
void cli_strtokenize(char *buffer, const char delim, const size_t token_count, const char **tokens)
{
size_t tokens_found;
for(tokens_found = 0; tokens_found < token_count; ) {
tokens[tokens_found++] = buffer;
buffer = strchr(buffer, delim);
if(buffer) {
*buffer++ = '\0';
} else {
while(tokens_found < token_count)
tokens[tokens_found++] = NULL;
return;
}
}
}

@ -20,6 +20,8 @@
#ifndef __STR_H
#define __STR_H
#include <sys/types.h>
int cli_strbcasestr(const char *haystack, const char *needle);
int cli_chomp(char *string);
char *cli_strtok(const char *line, int field, const char *delim);
@ -31,4 +33,5 @@ char *cli_utf16toascii(const char *str, unsigned int length);
char *cli_strtokbuf(const char *input, int fieldno, const char *delim, char *output);
const char *cli_memstr(const char *haystack, int hs, const char *needle, int ns);
char *cli_strrcpy(char *dest, const char *source);
void cli_strtokenize(char *buffer, const char delim, const size_t token_count, const char **tokens);
#endif

Loading…
Cancel
Save