git-svn: trunk@1757
Trog authored on 2005/11/15 19:28:57... | ... |
@@ -1,3 +1,8 @@ |
1 |
+Tue Nov 15 10:27:15 GMT 2005 (trog) |
|
2 |
+----------------------------------- |
|
3 |
+ * libclamav/unrar/unrar.c: Skip multipart volumes. |
|
4 |
+ Don't try and unpack invalid SOLID archives. |
|
5 |
+ |
|
1 | 6 |
Mon Nov 14 21:59:56 CET 2005 (tk) |
2 | 7 |
--------------------------------- |
3 | 8 |
* libclamav: add support for CryptFF, thanks to Arnaud Jacques |
... | ... |
@@ -1336,7 +1336,7 @@ rar_metadata_t *cli_unrar(int fd, const char *dirname, const struct cl_limits *l |
1336 | 1336 |
unpack_data->PrgStack.num_items = unpack_data->Filters.num_items = 0; |
1337 | 1337 |
unpack_data->unp_crc = 0xffffffff; |
1338 | 1338 |
|
1339 |
- /*unpack_init_data(FALSE, unpack_data);*/ |
|
1339 |
+ /* unpack_init_data(FALSE, unpack_data); */ |
|
1340 | 1340 |
ppm_constructor(&unpack_data->ppm_data); |
1341 | 1341 |
|
1342 | 1342 |
main_hdr = read_header(fd, MAIN_HEAD); |
... | ... |
@@ -1347,6 +1347,13 @@ rar_metadata_t *cli_unrar(int fd, const char *dirname, const struct cl_limits *l |
1347 | 1347 |
cli_dbgmsg("Head Type: %.2x\n", main_hdr->head_type); |
1348 | 1348 |
cli_dbgmsg("Flags: %.4x\n", main_hdr->flags); |
1349 | 1349 |
cli_dbgmsg("Head Size: %.4x\n", main_hdr->head_size); |
1350 |
+ if ((main_hdr->flags & MHD_VOLUME) != 0) { |
|
1351 |
+ /* Part of a RAR VOLUME - Skip it */ |
|
1352 |
+ cli_dbgmsg("RAR MUTIPART VOLUME - Skippng.\n"); |
|
1353 |
+ free(main_hdr); |
|
1354 |
+ return metadata; |
|
1355 |
+ } |
|
1356 |
+ |
|
1350 | 1357 |
if (main_hdr->head_size < SIZEOF_NEWMHD) { |
1351 | 1358 |
free(main_hdr); |
1352 | 1359 |
return metadata; |
... | ... |
@@ -1416,8 +1423,13 @@ rar_metadata_t *cli_unrar(int fd, const char *dirname, const struct cl_limits *l |
1416 | 1416 |
rar_unpack(fd, 15, (file_count>1) && |
1417 | 1417 |
((main_hdr->flags&MHD_SOLID)!=0), unpack_data); |
1418 | 1418 |
} else { |
1419 |
- rar_unpack(fd, file_header->unpack_ver, |
|
1420 |
- file_header->flags & LHD_SOLID, unpack_data); |
|
1419 |
+ if ((file_count == 1) && (file_header->flags & LHD_SOLID)) { |
|
1420 |
+ cli_warnmsg("RAR: First file can't be SOLID.\n"); |
|
1421 |
+ break; |
|
1422 |
+ } else { |
|
1423 |
+ rar_unpack(fd, file_header->unpack_ver, |
|
1424 |
+ file_header->flags & LHD_SOLID, unpack_data); |
|
1425 |
+ } |
|
1421 | 1426 |
} |
1422 | 1427 |
cli_dbgmsg("Expected File CRC: 0x%x\n", file_header->file_crc); |
1423 | 1428 |
cli_dbgmsg("Computed File CRC: 0x%x\n", unpack_data->unp_crc^0xffffffff); |