Fix data corruption reading tree files

This commit is contained in:
Terence Boldt
2026-01-18 17:30:02 -05:00
parent 6f995b1b7f
commit b29675bbd1

View File

@@ -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]...)