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)