git-svn: trunk@2970
Tomasz Kojm authored on 2007/03/26 21:57:02... | ... |
@@ -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 |