Browse code

* libclamav/unrar/unrar.c: Skip multipart volumes. Don't try and unpack invalid SOLID archives.

git-svn: trunk@1757

Trog authored on 2005/11/15 19:28:57
Showing 2 changed files
... ...
@@ -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);