Browse code

Fix decoding of some RAR2 files.

git-svn: trunk@2409

Trog authored on 2006/10/18 19:57:58
Showing 3 changed files
... ...
@@ -1,3 +1,7 @@
1
+Wed Oct 18 11:56:44 BST 2006 (trog)
2
+-----------------------------------
3
+  * libclamav/unrar/unrar.c,unrar.h: Fix decoding of some RAR2 files.
4
+
1 5
 Wed Oct 18 09:48:46 BST 2006 (trog)
2 6
 -----------------------------------
3 7
   * libclamav/unrar/unrar.c,unrar.h,unrar20.c,unrarfilter.c,unrarppm.c,unrarvm.c:
... ...
@@ -393,7 +393,8 @@ unsigned int getbits(unpack_data_t *unpack_data)
393 393
 int unp_read_buf(int fd, unpack_data_t *unpack_data)
394 394
 {
395 395
 	int data_size, retval;
396
-	 
396
+	unsigned int read_size;
397
+
397 398
 	data_size = unpack_data->read_top - unpack_data->in_addr;
398 399
 	if (data_size < 0) {
399 400
 		return FALSE;
... ...
@@ -410,9 +411,16 @@ int unp_read_buf(int fd, unpack_data_t *unpack_data)
410 410
 	} else {
411 411
 		data_size = unpack_data->read_top;
412 412
 	}
413
-	retval = cli_readn(fd, unpack_data->in_buf+data_size, (MAX_BUF_SIZE-data_size)&~0x0f);	
413
+	/* RAR2 depends on us only reading upto the end of the current compressed file */
414
+	if (unpack_data->pack_size < ((MAX_BUF_SIZE-data_size)&~0xf)) {
415
+		read_size = unpack_data->pack_size;
416
+	} else {
417
+		read_size = (MAX_BUF_SIZE-data_size)&~0xf;
418
+	}
419
+	retval = cli_readn(fd, unpack_data->in_buf+data_size, read_size);	
414 420
 	if (retval > 0) {
415 421
 		unpack_data->read_top += retval;
422
+		unpack_data->pack_size -= retval;
416 423
 	}
417 424
 	unpack_data->read_border = unpack_data->read_top - 30;
418 425
 
... ...
@@ -1457,6 +1465,7 @@ rar_metadata_t *cli_unrar(int fd, const char *dirname, const struct cl_limits *l
1457 1457
 				} else {
1458 1458
 					unpack_data->ofd = ofd;
1459 1459
 					unpack_data->dest_unp_size = comment_header->unpack_size;
1460
+					unpack_data->pack_size = comment_header->head_size - SIZEOF_COMMHEAD;
1460 1461
                         		retval = rar_unpack(fd, comment_header->unpack_ver, FALSE, unpack_data);
1461 1462
 				}
1462 1463
 				close(ofd);
... ...
@@ -1568,6 +1577,7 @@ rar_metadata_t *cli_unrar(int fd, const char *dirname, const struct cl_limits *l
1568 1568
 				copy_file_data(fd, ofd, file_header->pack_size);
1569 1569
 			} else {
1570 1570
 				unpack_data->dest_unp_size = file_header->unpack_size;
1571
+				unpack_data->pack_size = file_header->pack_size;
1571 1572
 				if (file_header->unpack_ver <= 15) {
1572 1573
 					retval = rar_unpack(fd, 15, (file_count>1) &&
1573 1574
 						((main_hdr->flags&MHD_SOLID)!=0), unpack_data);
... ...
@@ -272,6 +272,7 @@ typedef struct unpack_data_tag
272 272
 	int last_filter, old_filter_lengths_size;
273 273
 	int64_t written_size;
274 274
 	int64_t dest_unp_size;
275
+	uint32_t pack_size;
275 276
 	rarvm_data_t rarvm_data;
276 277
 	unsigned int unp_crc;
277 278