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... | ... |
@@ -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); |