Compare commits

...

2 Commits

Author SHA1 Message Date
Caleb Gardner 54d193a3df Possible fix for #22
Add sparse support for fragments (undocumented)
2023-08-12 13:30:15 -05:00
Caleb Gardner a129b259be Apply sparse file fix to reader 2023-08-11 18:15:11 -05:00
3 changed files with 16 additions and 6 deletions
+8 -2
View File
@@ -16,15 +16,17 @@ type Reader struct {
blockSizes []uint32
blockSize uint32
resetable bool
fileSize uint64
}
func NewReader(r io.Reader, d decompress.Decompressor, blockSizes []uint32, blockSize uint32) *Reader {
func NewReader(r io.Reader, d decompress.Decompressor, blockSizes []uint32, blockSize uint32, fileSize uint64) *Reader {
return &Reader{
d: d,
master: r,
blockSizes: blockSizes,
blockSize: blockSize,
resetable: true,
fileSize: fileSize,
}
}
@@ -49,7 +51,11 @@ func (r *Reader) advance() (err error) {
} else {
size := realSize(r.blockSizes[0])
if size == 0 {
r.cur = bytes.NewReader(make([]byte, r.blockSize))
outSize := r.blockSize
if r.fileSize < uint64(r.blockSize) {
outSize = uint32(r.fileSize)
}
r.cur = bytes.NewReader(make([]byte, outSize))
} else {
r.cur = io.LimitReader(r.master, int64(size))
if size == r.blockSizes[0] {
+5 -1
View File
@@ -1,6 +1,7 @@
package squashfs
import (
"bytes"
"io"
"github.com/CalebQ42/squashfs/internal/toreader"
@@ -12,8 +13,11 @@ type fragEntry struct {
_ uint32
}
func (r Reader) fragReader(index uint32) (io.Reader, error) {
func (r Reader) fragReader(index uint32, fragSize uint32) (io.Reader, error) {
realSize := r.fragEntries[index].Size &^ (1 << 24)
if realSize == 0 {
return bytes.NewReader(make([]byte, fragSize)), nil
}
rdr := io.LimitReader(toreader.NewReader(r.r, int64(r.fragEntries[index].Start)), int64(realSize))
if realSize != r.fragEntries[index].Size {
return rdr, nil
+3 -3
View File
@@ -54,12 +54,12 @@ func (r Reader) getReaders(i inode.Inode) (full *data.FullReader, rdr *data.Read
} else {
return nil, nil, errors.New("getReaders called on non-file type")
}
rdr = data.NewReader(toreader.NewReader(r.r, int64(blockOffset)), r.d, blockSizes, r.s.BlockSize)
rdr = data.NewReader(toreader.NewReader(r.r, int64(blockOffset)), r.d, blockSizes, r.s.BlockSize, fileSize)
full = data.NewFullReader(r.r, uint64(blockOffset), r.d, blockSizes, r.s.BlockSize, fileSize)
if fragInd != 0xFFFFFFFF {
full.AddFragment(func() (io.Reader, error) {
var fragRdr io.Reader
fragRdr, err = r.fragReader(fragInd)
fragRdr, err = r.fragReader(fragInd, fragSize)
if err != nil {
return nil, err
}
@@ -75,7 +75,7 @@ func (r Reader) getReaders(i inode.Inode) (full *data.FullReader, rdr *data.Read
return fragRdr, nil
})
var fragRdr io.Reader
fragRdr, err = r.fragReader(fragInd)
fragRdr, err = r.fragReader(fragInd, fragSize)
if err != nil {
return nil, nil, err
}