| 1417 | |
| 1418 | |
| 1419 | bool Archive::ReadSubData(Array<byte> *UnpData,File *DestFile,bool TestMode) |
| 1420 | { |
| 1421 | if (BrokenHeader) |
| 1422 | { |
| 1423 | uiMsg(UIERROR_SUBHEADERBROKEN,FileName); |
| 1424 | ErrHandler.SetErrorCode(RARX_CRC); |
| 1425 | return false; |
| 1426 | } |
| 1427 | if (SubHead.Method>5 || SubHead.UnpVer>(Format==RARFMT50 ? VER_UNPACK5:VER_UNPACK)) |
| 1428 | { |
| 1429 | uiMsg(UIERROR_SUBHEADERUNKNOWN,FileName); |
| 1430 | return false; |
| 1431 | } |
| 1432 | |
| 1433 | if (SubHead.PackSize==0 && !SubHead.SplitAfter) |
| 1434 | return true; |
| 1435 | |
| 1436 | SubDataIO.Init(); |
| 1437 | Unpack Unpack(&SubDataIO); |
| 1438 | Unpack.Init(SubHead.WinSize,false); |
| 1439 | |
| 1440 | if (DestFile==NULL) |
| 1441 | { |
| 1442 | if (SubHead.UnpSize>0x1000000) |
| 1443 | { |
| 1444 | // So huge allocation must never happen in valid archives. |
| 1445 | uiMsg(UIERROR_SUBHEADERUNKNOWN,FileName); |
| 1446 | return false; |
| 1447 | } |
| 1448 | if (UnpData==NULL) |
| 1449 | SubDataIO.SetTestMode(true); |
| 1450 | else |
| 1451 | { |
| 1452 | UnpData->Alloc((size_t)SubHead.UnpSize); |
| 1453 | SubDataIO.SetUnpackToMemory(&(*UnpData)[0],(uint)SubHead.UnpSize); |
| 1454 | } |
| 1455 | } |
| 1456 | if (SubHead.Encrypted) |
| 1457 | if (Cmd->Password.IsSet()) |
| 1458 | SubDataIO.SetEncryption(false,SubHead.CryptMethod,&Cmd->Password, |
| 1459 | SubHead.SaltSet ? SubHead.Salt:NULL,SubHead.InitV, |
| 1460 | SubHead.Lg2Count,SubHead.HashKey,SubHead.PswCheck); |
| 1461 | else |
| 1462 | return false; |
| 1463 | SubDataIO.UnpHash.Init(SubHead.FileHash.Type,1); |
| 1464 | SubDataIO.SetPackedSizeToRead(SubHead.PackSize); |
| 1465 | SubDataIO.EnableShowProgress(false); |
| 1466 | SubDataIO.SetFiles(this,DestFile); |
| 1467 | SubDataIO.SetTestMode(TestMode); |
| 1468 | SubDataIO.UnpVolume=SubHead.SplitAfter; |
| 1469 | SubDataIO.SetSubHeader(&SubHead,NULL); |
| 1470 | Unpack.SetDestSize(SubHead.UnpSize); |
| 1471 | if (SubHead.Method==0) |
| 1472 | CmdExtract::UnstoreFile(SubDataIO,SubHead.UnpSize); |
| 1473 | else |
| 1474 | Unpack.DoUnpack(SubHead.UnpVer,false); |
| 1475 | |
| 1476 | if (!SubDataIO.UnpHash.Cmp(&SubHead.FileHash,SubHead.UseHashKey ? SubHead.HashKey:NULL)) |
no test coverage detected