From b2c8084f41818f49123b71e43d80f43e9c3935fb Mon Sep 17 00:00:00 2001 From: Caleb Gardner Date: Fri, 6 Jun 2025 14:27:35 -0500 Subject: [PATCH] Minor tweaks --- internal/decompress/zstd.go | 6 +++++- low/data/fullreader.go | 3 --- low/file_base.go | 10 +++++++--- low/inode/file.go | 24 ++++++++++++------------ low/inode/inode.go | 9 ++++++++- squashfs_test.go | 2 +- 6 files changed, 33 insertions(+), 21 deletions(-) diff --git a/internal/decompress/zstd.go b/internal/decompress/zstd.go index bed443f..adc1fe2 100644 --- a/internal/decompress/zstd.go +++ b/internal/decompress/zstd.go @@ -16,5 +16,9 @@ func NewZstd() Zstd { } func (z Zstd) Decompress(data []byte) ([]byte, error) { - return z.rdr.DecodeAll(data, nil) + dat, err := z.rdr.DecodeAll(data, nil) + if err != nil { + return nil, err + } + return dat, err } diff --git a/low/data/fullreader.go b/low/data/fullreader.go index 74b0469..b46cceb 100644 --- a/low/data/fullreader.go +++ b/low/data/fullreader.go @@ -49,9 +49,6 @@ func (f *FullReader) AddFragData(blockStart uint64, blockSize uint32, offset uin _, err := f.rdr.ReadAt(dat, int64(blockStart)) if err != nil { return err - } - if realSize == 0 { - } if blockSize == realSize { dat, err = f.decomp.Decompress(dat) diff --git a/low/file_base.go b/low/file_base.go index 7e75146..85494dd 100644 --- a/low/file_base.go +++ b/low/file_base.go @@ -108,8 +108,12 @@ func (b FileBase) GetRegFileReaders(r Reader) (data.Reader, data.FullReader, err fileSize = b.Inode.Data.(inode.EFile).Size } outFull := data.NewFullReader(r.r, r.d, r.Superblock.BlockSize, fileSize, blockStart, sizes) - if fragIndex != 0xffffffff { - outFull.AddFragData(r.fragTable[fragIndex].Start, fragOffset, r.fragTable[fragIndex].Size) + if fragIndex != 0xFFFFFFFF { + ent, err := r.fragEntry(fragIndex) + if err != nil { + return data.Reader{}, data.FullReader{}, err + } + outFull.AddFragData(ent.Start, ent.Size, fragOffset) } outRdr, err := data.NewReader(&outFull) if err != nil { @@ -141,7 +145,7 @@ func (b FileBase) GetFullReader(r *Reader) (data.FullReader, error) { fileSize = b.Inode.Data.(inode.EFile).Size } outFull := data.NewFullReader(r.r, r.d, r.Superblock.BlockSize, fileSize, blockStart, sizes) - if fragIndex != 0xffffffff { + if fragIndex != 0xFFFFFFFF { ent, err := r.fragEntry(fragIndex) if err != nil { return data.FullReader{}, err diff --git a/low/inode/file.go b/low/inode/file.go index a82b75b..a30869b 100644 --- a/low/inode/file.go +++ b/low/inode/file.go @@ -20,10 +20,10 @@ func ReadFile(r io.Reader, blockSize uint32) (f File, err error) { if err != nil { return } - f.BlockStart = binary.LittleEndian.Uint32(dat) - f.FragInd = binary.LittleEndian.Uint32(dat[4:]) - f.FragOffset = binary.LittleEndian.Uint32(dat[8:]) - f.Size = binary.LittleEndian.Uint32(dat[12:]) + f.BlockStart = binary.LittleEndian.Uint32(dat[0:4]) + f.FragInd = binary.LittleEndian.Uint32(dat[4:8]) + f.FragOffset = binary.LittleEndian.Uint32(dat[8:12]) + f.Size = binary.LittleEndian.Uint32(dat[12:16]) toRead := int(math.Floor(float64(f.Size) / float64(blockSize))) if f.FragInd == 0xFFFFFFFF && f.Size%blockSize > 0 { toRead++ @@ -57,14 +57,14 @@ func ReadEFile(r io.Reader, blockSize uint32) (f EFile, err error) { if err != nil { return } - f.BlockStart = binary.LittleEndian.Uint64(dat) - f.Size = binary.LittleEndian.Uint64(dat[8:]) - f.Sparse = binary.LittleEndian.Uint64(dat[16:]) - f.LinkCount = binary.LittleEndian.Uint32(dat[24:]) - f.FragInd = binary.LittleEndian.Uint32(dat[28:]) - f.FragOffset = binary.LittleEndian.Uint32(dat[32:]) - f.XattrInd = binary.LittleEndian.Uint32(dat[36:]) - toRead := int(math.Floor(float64(f.Size) / float64(blockSize))) + f.BlockStart = binary.LittleEndian.Uint64(dat[0:8]) + f.Size = binary.LittleEndian.Uint64(dat[8:16]) + f.Sparse = binary.LittleEndian.Uint64(dat[16:24]) + f.LinkCount = binary.LittleEndian.Uint32(dat[24:28]) + f.FragInd = binary.LittleEndian.Uint32(dat[28:32]) + f.FragOffset = binary.LittleEndian.Uint32(dat[32:36]) + f.XattrInd = binary.LittleEndian.Uint32(dat[36:40]) + toRead := f.Size / uint64(blockSize) if f.FragInd == 0xFFFFFFFF && f.Size%uint64(blockSize) > 0 { toRead++ } diff --git a/low/inode/inode.go b/low/inode/inode.go index db9f238..d5b1dbb 100644 --- a/low/inode/inode.go +++ b/low/inode/inode.go @@ -40,10 +40,17 @@ type Inode struct { } func Read(r io.Reader, blockSize uint32) (i Inode, err error) { - err = binary.Read(r, binary.LittleEndian, &i.Header) + dat := make([]byte, 16) + _, err = r.Read(dat) if err != nil { return } + i.Type = binary.LittleEndian.Uint16(dat[0:2]) + i.Perm = binary.LittleEndian.Uint16(dat[2:4]) + i.UidInd = binary.LittleEndian.Uint16(dat[4:6]) + i.GidInd = binary.LittleEndian.Uint16(dat[6:8]) + i.ModTime = binary.LittleEndian.Uint32(dat[8:12]) + i.Num = binary.LittleEndian.Uint32(dat[12:16]) switch i.Type { case Dir: i.Data, err = ReadDir(r) diff --git a/squashfs_test.go b/squashfs_test.go index b679ad9..83c59c8 100644 --- a/squashfs_test.go +++ b/squashfs_test.go @@ -17,7 +17,7 @@ import ( const ( squashfsURL = "https://darkstorm.tech/files/LinuxPATest.sfs" - squashfsName = "test.sfs" + squashfsName = "tensorflow.sqfs" ) func preTest(dir string) (fil *os.File, err error) {