git-svn: trunk@2409
Trog authored on 2006/10/18 19:57:58... | ... |
@@ -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); |