git-svn-id: file:///var/lib/svn/clamav-devel/trunk/clamav-devel@630 77e5149b-7576-45b1-b177-96237e5ba77b
Trog authored on 2004/06/24 17:11:13... | ... |
@@ -1,3 +1,8 @@ |
1 |
+Thu Jun 24 09:09:27 BST 2004 (trog) |
|
2 |
+----------------------------------- |
|
3 |
+ * libclamav ole2_extract.[ch],scanners.c: proper file accounting (original patch |
|
4 |
+ from Maxim Dounin) |
|
5 |
+ |
|
1 | 6 |
Wed Jun 23 17:23:59 BST 2004 (njh) |
2 | 7 |
---------------------------------- |
3 | 8 |
* libclamav/mbox.c: Further optimisation in the handling of empty lines |
... | ... |
@@ -183,7 +183,7 @@ static void print_property_name(char *pname, int size) |
183 | 183 |
if (!name) { |
184 | 184 |
return; |
185 | 185 |
} |
186 |
- cli_dbgmsg("%34s", name); |
|
186 |
+ cli_dbgmsg("%34s ", name); |
|
187 | 187 |
free(name); |
188 | 188 |
return; |
189 | 189 |
} |
... | ... |
@@ -197,26 +197,26 @@ static void print_ole2_property(property_t *property) |
197 | 197 |
print_property_name(property->name, property->name_size); |
198 | 198 |
switch (property->type) { |
199 | 199 |
case 2: |
200 |
- cli_dbgmsg(" [file]"); |
|
200 |
+ cli_dbgmsg(" [file] "); |
|
201 | 201 |
break; |
202 | 202 |
case 1: |
203 |
- cli_dbgmsg(" [dir ]"); |
|
203 |
+ cli_dbgmsg(" [dir ] "); |
|
204 | 204 |
break; |
205 | 205 |
case 5: |
206 |
- cli_dbgmsg(" [root]"); |
|
206 |
+ cli_dbgmsg(" [root] "); |
|
207 | 207 |
break; |
208 | 208 |
default: |
209 | 209 |
cli_dbgmsg(" [%d]", property->type); |
210 | 210 |
} |
211 | 211 |
switch (property->color) { |
212 | 212 |
case 0: |
213 |
- cli_dbgmsg(" r"); |
|
213 |
+ cli_dbgmsg(" r "); |
|
214 | 214 |
break; |
215 | 215 |
case 1: |
216 |
- cli_dbgmsg(" b"); |
|
216 |
+ cli_dbgmsg(" b "); |
|
217 | 217 |
break; |
218 | 218 |
default: |
219 |
- cli_dbgmsg(" u"); |
|
219 |
+ cli_dbgmsg(" u "); |
|
220 | 220 |
} |
221 | 221 |
cli_dbgmsg(" %d %x\n", property->size, property->user_flags); |
222 | 222 |
} |
... | ... |
@@ -458,14 +458,19 @@ static void ole2_read_property_tree(int fd, ole2_header_t *hdr, const char *dir, |
458 | 458 |
|
459 | 459 |
static void ole2_walk_property_tree(int fd, ole2_header_t *hdr, const char *dir, int32_t prop_index, |
460 | 460 |
int (*handler)(int fd, ole2_header_t *hdr, property_t *prop, const char *dir), |
461 |
- int rec_level, int file_count) |
|
461 |
+ int rec_level, int *file_count, const struct cl_limits *limits) |
|
462 | 462 |
{ |
463 | 463 |
property_t prop_block[4]; |
464 | 464 |
int32_t index, current_block, count=0, i; |
465 | 465 |
unsigned char *dirname; |
466 | 466 |
current_block = hdr->prop_start; |
467 | 467 |
|
468 |
- if ((prop_index < 0) || (rec_level > 100) || (file_count > 100000)) { |
|
468 |
+ if ((prop_index < 0) || (rec_level > 100) || (*file_count > 100000)) { |
|
469 |
+ return; |
|
470 |
+ } |
|
471 |
+ |
|
472 |
+ if(limits && limits->maxfiles && (*file_count > limits->maxfiles)) { |
|
473 |
+ cli_dbgmsg("OLE2: File limit reached (max: %d)\n", limits->maxfiles); |
|
469 | 474 |
return; |
470 | 475 |
} |
471 | 476 |
|
... | ... |
@@ -500,33 +505,35 @@ static void ole2_walk_property_tree(int fd, ole2_header_t *hdr, const char *dir, |
500 | 500 |
switch (prop_block[index].type) { |
501 | 501 |
case 5: /* Root Entry */ |
502 | 502 |
if ((prop_index != 0) || (rec_level !=0) || |
503 |
- (file_count != 0)) { |
|
503 |
+ (*file_count != 0)) { |
|
504 | 504 |
/* Can only have RootEntry as the top */ |
505 | 505 |
cli_dbgmsg("ERROR: illegal Root Entry\n"); |
506 | 506 |
return; |
507 | 507 |
} |
508 | 508 |
hdr->sbat_root_start = prop_block[index].start_block; |
509 | 509 |
ole2_walk_property_tree(fd, hdr, dir, |
510 |
- prop_block[index].prev, handler, rec_level+1, file_count); |
|
510 |
+ prop_block[index].prev, handler, rec_level+1, file_count, limits); |
|
511 | 511 |
ole2_walk_property_tree(fd, hdr, dir, |
512 |
- prop_block[index].next, handler, rec_level+1, file_count); |
|
512 |
+ prop_block[index].next, handler, rec_level+1, file_count, limits); |
|
513 | 513 |
ole2_walk_property_tree(fd, hdr, dir, |
514 |
- prop_block[index].child, handler, rec_level+1, file_count); |
|
514 |
+ prop_block[index].child, handler, rec_level+1, file_count, limits); |
|
515 | 515 |
break; |
516 | 516 |
case 2: /* File */ |
517 |
+ (*file_count)++; |
|
517 | 518 |
if (!handler(fd, hdr, &prop_block[index], dir)) { |
518 | 519 |
cli_dbgmsg("ERROR: handler failed\n"); |
519 | 520 |
/* If we don't return on this error then |
520 | 521 |
we can sometimes pull VBA code |
521 | 522 |
from corrupted files. |
522 | 523 |
*/ |
524 |
+ |
|
523 | 525 |
} |
524 | 526 |
ole2_walk_property_tree(fd, hdr, dir, |
525 |
- prop_block[index].prev, handler, rec_level, file_count+1); |
|
527 |
+ prop_block[index].prev, handler, rec_level, file_count, limits); |
|
526 | 528 |
ole2_walk_property_tree(fd, hdr, dir, |
527 |
- prop_block[index].next, handler, rec_level, file_count+1); |
|
529 |
+ prop_block[index].next, handler, rec_level, file_count, limits); |
|
528 | 530 |
ole2_walk_property_tree(fd, hdr, dir, |
529 |
- prop_block[index].child, handler, rec_level, file_count+1); |
|
531 |
+ prop_block[index].child, handler, rec_level, file_count, limits); |
|
530 | 532 |
break; |
531 | 533 |
case 1: /* Directory */ |
532 | 534 |
dirname = (char *) cli_malloc(strlen(dir)+8); |
... | ... |
@@ -540,11 +547,11 @@ static void ole2_walk_property_tree(int fd, ole2_header_t *hdr, const char *dir, |
540 | 540 |
} |
541 | 541 |
cli_dbgmsg("OLE2 dir entry: %s\n",dirname); |
542 | 542 |
ole2_walk_property_tree(fd, hdr, dir, |
543 |
- prop_block[index].prev, handler, rec_level+1, file_count); |
|
543 |
+ prop_block[index].prev, handler, rec_level+1, file_count, limits); |
|
544 | 544 |
ole2_walk_property_tree(fd, hdr, dir, |
545 |
- prop_block[index].next, handler, rec_level+1, file_count); |
|
545 |
+ prop_block[index].next, handler, rec_level+1, file_count, limits); |
|
546 | 546 |
ole2_walk_property_tree(fd, hdr, dirname, |
547 |
- prop_block[index].child, handler, rec_level+1, file_count); |
|
547 |
+ prop_block[index].child, handler, rec_level+1, file_count, limits); |
|
548 | 548 |
free(dirname); |
549 | 549 |
break; |
550 | 550 |
default: |
... | ... |
@@ -695,11 +702,12 @@ static int ole2_read_header(int fd, ole2_header_t *hdr) |
695 | 695 |
return TRUE; |
696 | 696 |
} |
697 | 697 |
|
698 |
-int cli_ole2_extract(int fd, const char *dirname) |
|
698 |
+int cli_ole2_extract(int fd, const char *dirname, const struct cl_limits *limits) |
|
699 | 699 |
{ |
700 | 700 |
ole2_header_t hdr; |
701 | 701 |
int hdr_size; |
702 | 702 |
struct stat statbuf; |
703 |
+ int file_count=0; |
|
703 | 704 |
|
704 | 705 |
cli_dbgmsg("in cli_ole2_extract()\n"); |
705 | 706 |
|
... | ... |
@@ -778,7 +786,7 @@ int cli_ole2_extract(int fd, const char *dirname) |
778 | 778 |
|
779 | 779 |
/* OR */ |
780 | 780 |
|
781 |
- ole2_walk_property_tree(fd, &hdr, dirname, 0, handler_writefile, 0, 0); |
|
781 |
+ ole2_walk_property_tree(fd, &hdr, dirname, 0, handler_writefile, 0, &file_count, limits); |
|
782 | 782 |
|
783 | 783 |
abort: |
784 | 784 |
#ifdef HAVE_MMAP |
... | ... |
@@ -961,7 +961,7 @@ static int cli_scanole2(int desc, const char **virname, long int *scanned, const |
961 | 961 |
return CL_ETMPDIR; |
962 | 962 |
} |
963 | 963 |
|
964 |
- if((ret = cli_ole2_extract(desc, dir))) { |
|
964 |
+ if((ret = cli_ole2_extract(desc, dir, limits))) { |
|
965 | 965 |
cli_dbgmsg("ScanOLE2 -> %s\n", cl_strerror(ret)); |
966 | 966 |
cli_rmdirs(dir); |
967 | 967 |
free(dir); |