Browse code

proper file accounting (original patch from Maxim Dounin)

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
Showing 4 changed files
... ...
@@ -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
... ...
@@ -23,6 +23,8 @@
23 23
 #ifndef __OLE2_EXTRACT_H
24 24
 #define __OLE2_EXTRACT_H
25 25
 
26
-int cli_ole2_extract(int fd, const char *dirname);
26
+#include "clamav.h"
27
+
28
+int cli_ole2_extract(int fd, const char *dirname, const struct cl_limits *limits);
27 29
 
28 30
 #endif
... ...
@@ -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);