From 54d193a3df985eb6fb4826b1689d4495887946eb Mon Sep 17 00:00:00 2001 From: Caleb Gardner Date: Sat, 12 Aug 2023 13:30:15 -0500 Subject: [PATCH] Possible fix for #22 Add sparse support for fragments (undocumented) --- reader_frag.go | 6 +++++- reader_inode.go | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/reader_frag.go b/reader_frag.go index 87b79ca..0e94e2e 100644 --- a/reader_frag.go +++ b/reader_frag.go @@ -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 diff --git a/reader_inode.go b/reader_inode.go index 567d52b..ec0516c 100644 --- a/reader_inode.go +++ b/reader_inode.go @@ -59,7 +59,7 @@ func (r Reader) getReaders(i inode.Inode) (full *data.FullReader, rdr *data.Read 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 }