mirror of
https://github.com/tjboldt/ProDOS-Utilities.git
synced 2026-01-22 22:16:00 +00:00
Fix data corruption reading tree files
This commit is contained in:
@@ -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]...)
|
||||
|
||||
Reference in New Issue
Block a user