Browse code

make signature parser more elastic

git-svn-id: file:///var/lib/svn/clamav-devel/trunk/clamav-devel@982 77e5149b-7576-45b1-b177-96237e5ba77b

Tomasz Kojm authored on 2004/10/09 10:10:29
Showing 2 changed files
... ...
@@ -1,3 +1,7 @@
1
+Sat Oct  9 03:07:35 CEST 2004 (tk)
2
+----------------------------------
3
+  * libclamav/readdb.c: make signature parser more elastic
4
+
1 5
 Fri Oct  8 17:53:30 CEST 2004 (tk)
2 6
 ----------------------------------
3 7
   * clamd/others.c: improve poll code in is_fd_connected() (Trog)
... ...
@@ -229,7 +229,7 @@ int cli_parse_add(struct cl_node *root, const char *virname, const char *hexsig,
229 229
 {
230 230
 	struct cli_bm_patt *bm_new;
231 231
 	char *pt, *hexcpy, *start, *n;
232
-	int ret, virlen, parts = 0, i, len;
232
+	int ret, virlen, parts = 0, i, j, len, asterisk;
233 233
 	int mindist = 0, maxdist = 0, error = 0;
234 234
 
235 235
 
... ...
@@ -242,7 +242,7 @@ int cli_parse_add(struct cl_node *root, const char *virname, const char *hexsig,
242 242
 
243 243
 	len = strlen(hexsig);
244 244
 	for(i = 0; i < len; i++)
245
-	    if(hexsig[i] == '{')
245
+	    if(hexsig[i] == '{' || hexsig[i] == '*')
246 246
 		parts++;
247 247
 
248 248
 	if(parts)
... ...
@@ -252,12 +252,23 @@ int cli_parse_add(struct cl_node *root, const char *virname, const char *hexsig,
252 252
 	for(i = 1; i <= parts; i++) {
253 253
 
254 254
 	    if(i != parts) {
255
-		pt = strchr(start, '{');
255
+		for(j = 0; j < strlen(start); j++) {
256
+		    if(start[j] == '{') {
257
+			asterisk = 0;
258
+			pt = start + j;
259
+			break;
260
+		    }
261
+		    if(start[j] == '*') {
262
+			asterisk = 1;
263
+			pt = start + j;
264
+			break;
265
+		    }
266
+		}
256 267
 		*pt++ = 0;
257 268
 	    }
258 269
 
259 270
 	    if((ret = cli_ac_addsig(root, virname, start, root->ac_partsigs, parts, i, type, mindist, maxdist, offset, target))) {
260
-		cli_errmsg("cli_parse_add(): Problem adding signature.\n");
271
+		cli_errmsg("cli_parse_add(): Problem adding signature (1).\n");
261 272
 		error = 1;
262 273
 		break;
263 274
 	    }
... ...
@@ -265,6 +276,13 @@ int cli_parse_add(struct cl_node *root, const char *virname, const char *hexsig,
265 265
 	    if(i == parts)
266 266
 		break;
267 267
 
268
+	    mindist = maxdist = 0;
269
+
270
+	    if(asterisk) {
271
+		start = pt;
272
+		continue;
273
+	    }
274
+
268 275
 	    if(!(start = strchr(pt, '}'))) {
269 276
 		error = 1;
270 277
 		break;
... ...
@@ -276,7 +294,6 @@ int cli_parse_add(struct cl_node *root, const char *virname, const char *hexsig,
276 276
 		break;
277 277
 	    }
278 278
 
279
-	    mindist = maxdist = 0;
280 279
 	    if(!strchr(pt, '-')) {
281 280
 		if((mindist = maxdist = atoi(pt)) < 0) {
282 281
 		    error = 1;
... ...
@@ -325,7 +342,7 @@ int cli_parse_add(struct cl_node *root, const char *virname, const char *hexsig,
325 325
 	    }
326 326
 
327 327
 	    if((ret = cli_ac_addsig(root, virname, pt, root->ac_partsigs, parts, i, type, 0, 0, offset, target))) {
328
-		cli_errmsg("cli_parse_add(): Problem adding signature.\n");
328
+		cli_errmsg("cli_parse_add(): Problem adding signature (2).\n");
329 329
 		free(pt);
330 330
 		return ret;
331 331
 	    }
... ...
@@ -335,7 +352,7 @@ int cli_parse_add(struct cl_node *root, const char *virname, const char *hexsig,
335 335
 
336 336
     } else if(strpbrk(hexsig, "?(") || type) {
337 337
 	if((ret = cli_ac_addsig(root, virname, hexsig, 0, 0, 0, type, 0, 0, offset, target))) {
338
-	    cli_errmsg("cli_parse_add(): Problem adding signature\n");
338
+	    cli_errmsg("cli_parse_add(): Problem adding signature (3).\n");
339 339
 	    return ret;
340 340
 	}
341 341
 
... ...
@@ -377,7 +394,7 @@ int cli_parse_add(struct cl_node *root, const char *virname, const char *hexsig,
377 377
 	    root->maxpatlen = bm_new->length;
378 378
 
379 379
 	if((ret = cli_bm_addpatt(root, bm_new))) {
380
-	    cli_errmsg("cli_parse_add(): Problem adding signature\n");
380
+	    cli_errmsg("cli_parse_add(): Problem adding signature (4).\n");
381 381
 	    free(bm_new->pattern);
382 382
 	    free(bm_new->virname);
383 383
 	    free(bm_new);