Browse code

optimize loading of .ndb files (bb#339)

git-svn: trunk@2970

Tomasz Kojm authored on 2007/03/26 21:57:02
Showing 4 changed files
... ...
@@ -1,3 +1,7 @@
1
+Mon Mar 26 13:05:01 CEST 2007 (tk)
2
+----------------------------------
3
+  * libclamav: optimize loading of .ndb files (bb#339), patch from Edwin
4
+
1 5
 Sat Mar 24 15:01:50 CET 2007 (acab)
2 6
 -----------------------------------
3 7
   * 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
704 704
 }
705 705
 #endif
706 706
 
707
+#define NDB_TOKENS 6
707 708
 static int cli_loadndb(FILE *fd, struct cl_engine **engine, unsigned int *signo, unsigned short sdb, unsigned int options)
708 709
 {
709
-	char buffer[FILEBUFF], *sig, *virname, *offset, *pt;
710
+	const char *tokens[NDB_TOKENS];
711
+	char buffer[FILEBUFF];
712
+	const char *sig, *virname, *offset, *pt;
710 713
 	struct cli_matcher *root;
711 714
 	int line = 0, sigs = 0, ret = 0;
712 715
 	unsigned short target;
... ...
@@ -736,15 +739,15 @@ static int cli_loadndb(FILE *fd, struct cl_engine **engine, unsigned int *signo,
736 736
 	sigs++;
737 737
 	cli_chomp(buffer);
738 738
 
739
-	if(!(virname = cli_strtok(buffer, 0, ":"))) {
739
+	cli_strtokenize(buffer, ':', NDB_TOKENS, tokens);
740
+
741
+	if(!(virname = tokens[0])) {
740 742
 	    ret = CL_EMALFDB;
741 743
 	    break;
742 744
 	}
743 745
 
744
-	if((pt = cli_strtok(buffer, 4, ":"))) { /* min version */
746
+	if((pt = tokens[4])) { /* min version */
745 747
 	    if(!isdigit(*pt)) {
746
-		free(virname);
747
-		free(pt);
748 748
 		ret = CL_EMALFDB;
749 749
 		break;
750 750
 	    }
... ...
@@ -752,79 +755,56 @@ static int cli_loadndb(FILE *fd, struct cl_engine **engine, unsigned int *signo,
752 752
 	    if((unsigned int) atoi(pt) > cl_retflevel()) {
753 753
 		cli_dbgmsg("Signature for %s not loaded (required f-level: %d)\n", virname, atoi(pt));
754 754
 		sigs--;
755
-		free(virname);
756
-		free(pt);
757 755
 		continue;
758 756
 	    }
759 757
 
760
-	    free(pt);
761 758
 
762
-	    if((pt = cli_strtok(buffer, 5, ":"))) { /* max version */
759
+	    if((pt = tokens[5])) { /* max version */
763 760
 		if(!isdigit(*pt)) {
764
-		    free(virname);
765
-		    free(pt);
766 761
 		    ret = CL_EMALFDB;
767 762
 		    break;
768 763
 		}
769 764
 
770 765
 		if((unsigned int) atoi(pt) < cl_retflevel()) {
771 766
 		    sigs--;
772
-		    free(virname);
773
-		    free(pt);
774 767
 		    continue;
775 768
 		}
776 769
 
777
-		free(pt);
778 770
 	    }
779 771
 	}
780 772
 
781
-	if(!(pt = cli_strtok(buffer, 1, ":")) || !isdigit(*pt)) {
782
-	    free(virname);
783
-	    if(pt)
784
-		free(pt);
773
+	if(!(pt = tokens[1]) || !isdigit(*pt)) {
785 774
 	    ret = CL_EMALFDB;
786 775
 	    break;
787 776
 	}
788 777
 	target = (unsigned short) atoi(pt);
789
-	free(pt);
790 778
 
791 779
 	if(target >= CL_TARGET_TABLE_SIZE) {
792 780
 	    cli_dbgmsg("Not supported target type in signature for %s\n", virname);
793 781
 	    sigs--;
794
-	    free(virname);
795 782
 	    continue;
796 783
 	}
797 784
 
798 785
 	root = (*engine)->root[target];
799 786
 
800
-	if(!(offset = cli_strtok(buffer, 2, ":"))) {
801
-	    free(virname);
787
+	if(!(offset = tokens[2])) {
802 788
 	    ret = CL_EMALFDB;
803 789
 	    break;
804 790
 	} else if(!strcmp(offset, "*")) {
805
-	    free(offset);
806 791
 	    offset = NULL;
807 792
 	}
808 793
 
809
-	if(!(sig = cli_strtok(buffer, 3, ":"))) {
810
-	    free(virname);
811
-	    free(offset);
794
+	if(!(sig = tokens[3])) {
812 795
 	    ret = CL_EMALFDB;
813 796
 	    break;
814 797
 	}
815 798
 
816 799
 	if((ret = cli_parse_add(root, virname, sig, 0, offset, target))) {
817 800
 	    cli_errmsg("Problem parsing signature at line %d\n", line);
818
-	    free(virname);
819
-	    free(offset);
820
-	    free(sig);
821 801
 	    ret = CL_EMALFDB;
822 802
 	    break;
823 803
 	}
824 804
 
825
-	free(virname);
826
-	free(offset);
827
-	free(sig);
828 805
     }
829 806
 
830 807
     if(!line) {
... ...
@@ -1,6 +1,7 @@
1 1
 /*
2 2
  *  Copyright (C) 2002 - 2005 Tomasz Kojm <tkojm@clamav.net>
3 3
  *  cli_strrcpy(): Copyright (C) 2002 Nigel Horne <njh@bandsman.co.uk>
4
+ *  cli_strtokenize(): Copyright (C) 2007 Edwin Torok <edwin@clamav.net>
4 5
  *
5 6
  *  This program is free software; you can redistribute it and/or modify
6 7
  *  it under the terms of the GNU General Public License as published by
... ...
@@ -28,6 +29,7 @@
28 28
 #include <stdlib.h>
29 29
 #include <string.h>
30 30
 #include <ctype.h>
31
+#include <sys/types.h>
31 32
 
32 33
 #include "clamav.h"
33 34
 #include "others.h"
... ...
@@ -370,3 +372,22 @@ char *cli_strrcpy(char *dest, const char *source) /* by NJH */
370 370
 
371 371
     return --dest;
372 372
 }
373
+
374
+void cli_strtokenize(char *buffer, const char delim, const size_t token_count, const char **tokens)
375
+{
376
+	size_t tokens_found;
377
+
378
+
379
+    for(tokens_found = 0; tokens_found < token_count; ) {
380
+	tokens[tokens_found++] = buffer;
381
+	buffer = strchr(buffer, delim);
382
+	if(buffer) {
383
+	    *buffer++ = '\0';
384
+	} else {
385
+	    while(tokens_found < token_count)
386
+		tokens[tokens_found++] = NULL;
387
+
388
+	    return;
389
+	}
390
+    }
391
+}
... ...
@@ -20,6 +20,8 @@
20 20
 #ifndef __STR_H
21 21
 #define __STR_H
22 22
 
23
+#include <sys/types.h>
24
+
23 25
 int cli_strbcasestr(const char *haystack, const char *needle);
24 26
 int cli_chomp(char *string);
25 27
 char *cli_strtok(const char *line, int field, const char *delim);
... ...
@@ -31,4 +33,5 @@ char *cli_utf16toascii(const char *str, unsigned int length);
31 31
 char *cli_strtokbuf(const char *input, int fieldno, const char *delim, char *output);
32 32
 const char *cli_memstr(const char *haystack, int hs, const char *needle, int ns);
33 33
 char *cli_strrcpy(char *dest, const char *source);
34
+void cli_strtokenize(char *buffer, const char delim, const size_t token_count, const char **tokens);
34 35
 #endif