72 IN UINTN DataForkOffset,
81 UINT64 BlockSectorTop;
82 UINT64 ChunkSectorTop;
85 ASSERT (MaxSize >=
sizeof (*BlockData));
87 BlockData->ChunkCount = SwapBytes32 (BlockData->ChunkCount);
89 Result = BaseOverflowMulU32 (
90 BlockData->ChunkCount,
91 sizeof (*BlockData->Chunks),
94 if (Result || (ChunksSize > (MaxSize -
sizeof (*BlockData)))) {
98 MaxOffset = (DataForkOffset + DataForkSize);
100 BlockData->Version = SwapBytes32 (BlockData->Version);
101 BlockData->SectorNumber =
SwapBytes64 (BlockData->SectorNumber);
102 BlockData->SectorCount =
SwapBytes64 (BlockData->SectorCount);
103 BlockData->DataOffset =
SwapBytes64 (BlockData->DataOffset);
104 BlockData->BuffersNeeded = SwapBytes32 (BlockData->BuffersNeeded);
105 BlockData->BlockDescriptors = SwapBytes32 (BlockData->BlockDescriptors);
106 BlockData->Checksum.Type = SwapBytes32 (BlockData->Checksum.Type);
107 BlockData->Checksum.Size = SwapBytes32 (BlockData->Checksum.Size);
109 if ( (BlockData->DataOffset > DataForkOffset)
110 || (BlockData->Checksum.Size > (sizeof (BlockData->Checksum.Data) * 8))
111 || (BlockData->DataOffset > MaxOffset))
116 Result = BaseOverflowAddU64 (
117 BlockData->SectorNumber,
118 BlockData->SectorCount,
121 if (Result || (BlockSectorTop > SectorCount)) {
122 DEBUG ((DEBUG_ERROR,
"OCDI: Block sectors exceed DMG sectors %lu %lu\n", BlockSectorTop, SectorCount));
127 BlockData->Checksum.Data[Index] = SwapBytes32 (
128 BlockData->Checksum.Data[Index]
132 for (Index = 0; Index < BlockData->ChunkCount; ++Index) {
133 Chunk = &BlockData->Chunks[Index];
135 Chunk->
Type = SwapBytes32 (Chunk->
Type);
142 Result = BaseOverflowAddU64 (
147 if (Result || (ChunkSectorTop > BlockSectorTop)) {
151 Result = BaseOverflowAddU64 (
156 if (Result || (OffsetTop > MaxOffset)) {
168 IN UINTN SectorCount,
169 IN UINTN DataForkOffset,
170 IN UINTN DataForkSize,
187 UINT32 BlockDictChildDataSize;
190 UINT32 DmgBlocksSize;
206 if (XmlPlistDoc == NULL) {
212 if (NodeRoot == NULL) {
220 &NodeResourceForkKey,
221 &NodeResourceForkValue
228 NodeResourceForkValue,
238 if (NumDmgBlocks == 0) {
243 Result = !BaseOverflowMulU32 (NumDmgBlocks,
sizeof (*DmgBlocks), &DmgBlocksSize);
249 DmgBlocks = AllocatePool (DmgBlocksSize);
250 if (DmgBlocks == NULL) {
255 for (Index = 0; Index < NumDmgBlocks; ++Index) {
256 NodeBlockDict =
XmlNodeChild (NodeBlockListValue, Index);
268 Result =
PlistDataSize (BlockDictChildValue, &BlockDictChildDataSize);
269 if (!Result || (BlockDictChildDataSize <
sizeof (*Block))) {
274 Block = AllocatePool (BlockDictChildDataSize);
280 DmgBlocks[Index] = Block;
285 &BlockDictChildDataSize
294 BlockDictChildDataSize,
310 if (!Result && (DmgBlocks != NULL)) {
311 while ((Index--) != 0) {
312 FreePool (DmgBlocks[Index]);
315 FreePool (DmgBlocks);
318 if (XmlPlistDoc != NULL) {
BOOLEAN InternalParsePlist(IN CHAR8 *Plist, IN UINT32 PlistSize, IN UINTN SectorCount, IN UINTN DataForkOffset, IN UINTN DataForkSize, OUT UINT32 *BlockCount, OUT APPLE_DISK_IMAGE_BLOCK_DATA ***Blocks)