From b29675bbd1a8a9bac8e122da5bba413758aa2995 Mon Sep 17 00:00:00 2001 From: Terence Boldt Date: Sun, 18 Jan 2026 17:30:02 -0500 Subject: [PATCH] Fix data corruption reading tree files --- prodos/file.go | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/prodos/file.go b/prodos/file.go index 6b768d6..3b52793 100644 --- a/prodos/file.go +++ b/prodos/file.go @@ -30,7 +30,7 @@ func LoadFile(reader io.ReaderAt, path string) ([]byte, error) { buffer := make([]byte, fileEntry.EndOfFile) var block []byte - for i := uint16(0); i < uint16(len(blockList)); i++ { + for i := uint32(0); i < uint32(len(blockList)); i++ { if blockList[i] == 0 { block = zeroData() } else { @@ -39,7 +39,7 @@ func LoadFile(reader io.ReaderAt, path string) ([]byte, error) { return nil, err } } - for j := uint16(0); j < 512 && uint32(i)*512+uint32(j) < fileEntry.EndOfFile; j++ { + for j := uint32(0); j < 512 && uint32(i)*512+uint32(j) < fileEntry.EndOfFile; j++ { buffer[i*512+j] = block[j] } } @@ -352,9 +352,9 @@ func getBlocklist(reader io.ReaderAt, fileEntry FileEntry, dataOnly bool) ([]uin case StorageTree: // the number of dataBlocks in the list can be longer than the actual blocks used // because of sparse files - dataBlocks := make([]uint16, fileEntry.EndOfFile/512) + dataBlocks := make([]uint16, fileEntry.EndOfFile/512+1) // this can be more than needed - numberOfIndexBlocks := fileEntry.BlocksUsed/256 + 2 + numberOfIndexBlocks := fileEntry.EndOfFile/512 + 2 indexBlocks := make([]uint16, numberOfIndexBlocks) masterIndex, err := ReadBlock(reader, fileEntry.KeyPointer) if err != nil { @@ -379,17 +379,18 @@ func getBlocklist(reader io.ReaderAt, fileEntry FileEntry, dataOnly bool) ([]uin return nil, err } for j := uint16(0); j < 256 && bytesRemaining > 0; j++ { - if (uint16(index[j]) + uint16(index[j+256])*256) == 0 { - break - } + dataBlocks[numberOfDataBlocks] = uint16(index[j]) + uint16(index[j+256])*256 numberOfDataBlocks++ - bytesRemaining -= 512 - dataBlocks[i*256+j] = uint16(index[j]) + uint16(index[j+256])*256 + if bytesRemaining < 512 { + bytesRemaining = 0 + } else { + bytesRemaining -= 512 + } } } if dataOnly { - return dataBlocks, nil + return dataBlocks[0:numberOfDataBlocks], nil } blocks = append(indexBlocks[0:numberOfIndexBlocks], dataBlocks[0:numberOfDataBlocks]...)