git-svn: trunk@2661
Tomasz Kojm authored on 2007/02/01 03:06:03... | ... |
@@ -1,3 +1,7 @@ |
1 |
+Wed Jan 31 19:03:47 CET 2007 (tk) |
|
2 |
+--------------------------------- |
|
3 |
+ * libclamav/readdb.c: fix handling of some broken signatures (bb#258) |
|
4 |
+ |
|
1 | 5 |
Wed Jan 31 14:21:36 CET 2007 (tk) |
2 | 6 |
--------------------------------- |
3 | 7 |
* freshclam: disable mirror manager when using proxy (bb#223) |
... | ... |
@@ -74,7 +74,7 @@ static pthread_mutex_t cli_ref_mutex = PTHREAD_MUTEX_INITIALIZER; |
74 | 74 |
|
75 | 75 |
/* TODO: clean up the code */ |
76 | 76 |
|
77 |
-static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const char *hexsig, int sigid, int parts, int partno, unsigned short type, unsigned int mindist, unsigned int maxdist, char *offset, unsigned short target) |
|
77 |
+static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const char *hexsig, int sigid, int parts, int partno, unsigned short type, unsigned int mindist, unsigned int maxdist, const char *offset, unsigned short target) |
|
78 | 78 |
{ |
79 | 79 |
struct cli_ac_patt *new; |
80 | 80 |
char *pt, *hex; |
... | ... |
@@ -100,18 +100,26 @@ static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const ch |
100 | 100 |
new->mindist = mindist; |
101 | 101 |
new->maxdist = maxdist; |
102 | 102 |
new->target = target; |
103 |
- new->offset = offset; |
|
103 |
+ if(offset) { |
|
104 |
+ new->offset = cli_strdup(offset); |
|
105 |
+ if(!new->offset) |
|
106 |
+ return CL_EMEM; |
|
107 |
+ } |
|
104 | 108 |
|
105 | 109 |
if(strchr(hexsig, '(')) { |
106 | 110 |
char *hexcpy, *hexnew, *start, *h, *c; |
107 | 111 |
|
108 | 112 |
if(!(hexcpy = strdup(hexsig))) { |
113 |
+ if(new->offset) |
|
114 |
+ free(new->offset); |
|
109 | 115 |
free(new); |
110 | 116 |
return CL_EMEM; |
111 | 117 |
} |
112 | 118 |
|
113 | 119 |
if(!(hexnew = (char *) cli_calloc(strlen(hexsig) + 1, 1))) { |
114 | 120 |
free(hexcpy); |
121 |
+ if(new->offset) |
|
122 |
+ free(new->offset); |
|
115 | 123 |
free(new); |
116 | 124 |
return CL_EMEM; |
117 | 125 |
} |
... | ... |
@@ -137,7 +145,7 @@ static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const ch |
137 | 137 |
new->alt++; |
138 | 138 |
new->altn = (unsigned short int *) cli_realloc(new->altn, new->alt * sizeof(unsigned short int)); |
139 | 139 |
new->altn[new->alt - 1] = 0; |
140 |
- new->altc = (char **) cli_realloc(new->altc, new->alt * sizeof(char *)); |
|
140 |
+ new->altc = (unsigned char **) cli_realloc(new->altc, new->alt * sizeof(char *)); |
|
141 | 141 |
new->altc[new->alt - 1] = NULL; |
142 | 142 |
|
143 | 143 |
for(i = 0; i < strlen(pt); i++) |
... | ... |
@@ -150,7 +158,7 @@ static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const ch |
150 | 150 |
} else |
151 | 151 |
new->altn[new->alt - 1]++; |
152 | 152 |
|
153 |
- if(!(new->altc[new->alt - 1] = (char *) cli_calloc(new->altn[new->alt - 1], 1))) { |
|
153 |
+ if(!(new->altc[new->alt - 1] = (unsigned char *) cli_calloc(new->altn[new->alt - 1], 1))) { |
|
154 | 154 |
error = 1; |
155 | 155 |
break; |
156 | 156 |
} |
... | ... |
@@ -184,6 +192,8 @@ static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const ch |
184 | 184 |
|
185 | 185 |
if(error) { |
186 | 186 |
FREE_ALT; |
187 |
+ if(new->offset) |
|
188 |
+ free(new->offset); |
|
187 | 189 |
free(new); |
188 | 190 |
return CL_EMALFDB; |
189 | 191 |
} |
... | ... |
@@ -193,6 +203,8 @@ static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const ch |
193 | 193 |
|
194 | 194 |
if((new->pattern = cli_hex2si(hex)) == NULL) { |
195 | 195 |
FREE_ALT; |
196 |
+ if(new->offset) |
|
197 |
+ free(new->offset); |
|
196 | 198 |
free(new); |
197 | 199 |
return CL_EMALFDB; |
198 | 200 |
} |
... | ... |
@@ -221,6 +233,8 @@ static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const ch |
221 | 221 |
|
222 | 222 |
if(wprefix) { |
223 | 223 |
FREE_ALT; |
224 |
+ if(new->offset) |
|
225 |
+ free(new->offset); |
|
224 | 226 |
free(new->pattern); |
225 | 227 |
free(new); |
226 | 228 |
return CL_EMALFDB; |
... | ... |
@@ -250,6 +264,8 @@ static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const ch |
250 | 250 |
else |
251 | 251 |
free(new->pattern); |
252 | 252 |
FREE_ALT; |
253 |
+ if(new->offset) |
|
254 |
+ free(new->offset); |
|
253 | 255 |
free(new); |
254 | 256 |
return CL_EMALFDB; |
255 | 257 |
} |
... | ... |
@@ -260,6 +276,8 @@ static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const ch |
260 | 260 |
else |
261 | 261 |
free(new->pattern); |
262 | 262 |
FREE_ALT; |
263 |
+ if(new->offset) |
|
264 |
+ free(new->offset); |
|
263 | 265 |
free(new); |
264 | 266 |
return CL_EMEM; |
265 | 267 |
} |
... | ... |
@@ -273,6 +291,8 @@ static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const ch |
273 | 273 |
free(new->pattern); |
274 | 274 |
free(new->virname); |
275 | 275 |
FREE_ALT; |
276 |
+ if(new->offset) |
|
277 |
+ free(new->offset); |
|
276 | 278 |
free(new); |
277 | 279 |
return ret; |
278 | 280 |
} |
... | ... |
@@ -283,7 +303,7 @@ static int cli_ac_addsig(struct cli_matcher *root, const char *virname, const ch |
283 | 283 |
return CL_SUCCESS; |
284 | 284 |
} |
285 | 285 |
|
286 |
-int cli_parse_add(struct cli_matcher *root, const char *virname, const char *hexsig, unsigned short type, char *offset, unsigned short target) |
|
286 |
+int cli_parse_add(struct cli_matcher *root, const char *virname, const char *hexsig, unsigned short type, const char *offset, unsigned short target) |
|
287 | 287 |
{ |
288 | 288 |
struct cli_bm_patt *bm_new; |
289 | 289 |
char *pt, *hexcpy, *start, *n; |
... | ... |
@@ -420,7 +440,7 @@ int cli_parse_add(struct cli_matcher *root, const char *virname, const char *hex |
420 | 420 |
if(!bm_new) |
421 | 421 |
return CL_EMEM; |
422 | 422 |
|
423 |
- if(!(bm_new->pattern = cli_hex2str(hexsig))) { |
|
423 |
+ if(!(bm_new->pattern = (unsigned char *) cli_hex2str(hexsig))) { |
|
424 | 424 |
free(bm_new); |
425 | 425 |
return CL_EMALFDB; |
426 | 426 |
} |
... | ... |
@@ -446,7 +466,14 @@ int cli_parse_add(struct cli_matcher *root, const char *virname, const char *hex |
446 | 446 |
|
447 | 447 |
strncpy(bm_new->virname, virname, virlen); |
448 | 448 |
|
449 |
- bm_new->offset = offset; |
|
449 |
+ bm_new->offset = strdup(offset); |
|
450 |
+ if(!bm_new->offset) { |
|
451 |
+ free(bm_new->pattern); |
|
452 |
+ free(bm_new->virname); |
|
453 |
+ free(bm_new); |
|
454 |
+ return CL_EMEM; |
|
455 |
+ } |
|
456 |
+ |
|
450 | 457 |
bm_new->target = target; |
451 | 458 |
|
452 | 459 |
if(bm_new->length > root->maxpatlen) |
... | ... |
@@ -781,6 +808,7 @@ static int cli_loadndb(FILE *fd, struct cl_engine **engine, unsigned int *signo, |
781 | 781 |
} |
782 | 782 |
|
783 | 783 |
free(virname); |
784 |
+ free(offset); |
|
784 | 785 |
free(sig); |
785 | 786 |
} |
786 | 787 |
|
... | ... |
@@ -22,7 +22,7 @@ |
22 | 22 |
|
23 | 23 |
#include "clamav.h" |
24 | 24 |
|
25 |
-int cli_parse_add(struct cli_matcher *root, const char *virname, const char *hexsig, unsigned short type, char *offset, unsigned short target); |
|
25 |
+int cli_parse_add(struct cli_matcher *root, const char *virname, const char *hexsig, unsigned short type, const char *offset, unsigned short target); |
|
26 | 26 |
|
27 | 27 |
int cli_initengine(struct cl_engine **engine, unsigned int options); |
28 | 28 |
|