Browse code

fix handling of some broken signatures (bb#258)

git-svn: trunk@2661

Tomasz Kojm authored on 2007/02/01 03:06:03
Showing 3 changed files
... ...
@@ -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