diff --git a/internal/inode/file.go b/internal/inode/file.go index 950aa59..1b4d461 100644 --- a/internal/inode/file.go +++ b/internal/inode/file.go @@ -9,7 +9,7 @@ import ( type fileInit struct { BlockStart uint32 FragInd uint32 - Offset uint32 + FragOffset uint32 Size uint32 } @@ -24,7 +24,7 @@ type eFileInit struct { Sparse uint64 LinkCount uint32 FragInd uint32 - Offset uint32 + FragOffset uint32 XattrInd uint32 } diff --git a/reader_inode.go b/reader_inode.go index dee0176..0a8e11d 100644 --- a/reader_inode.go +++ b/reader_inode.go @@ -37,13 +37,13 @@ func (r Reader) getReaders(i inode.Inode) (full *data.FullReader, rdr *data.Read var fragInd uint32 var fragSize uint32 if i.Type == inode.Fil { - fragOffset = uint64(i.Data.(inode.File).Offset) + fragOffset = uint64(i.Data.(inode.File).FragOffset) blockOffset = uint64(i.Data.(inode.File).BlockStart) blockSizes = i.Data.(inode.File).BlockSizes fragInd = i.Data.(inode.File).FragInd fragSize = i.Data.(inode.File).Size % r.s.BlockSize } else if i.Type == inode.EFil { - fragOffset = uint64(i.Data.(inode.EFile).Offset) + fragOffset = uint64(i.Data.(inode.EFile).FragOffset) blockOffset = i.Data.(inode.EFile).BlockStart blockSizes = i.Data.(inode.EFile).BlockSizes fragInd = i.Data.(inode.EFile).FragInd @@ -60,9 +60,13 @@ func (r Reader) getReaders(i inode.Inode) (full *data.FullReader, rdr *data.Read if err != nil { return nil, err } - _, err = fragRdr.Read(make([]byte, fragOffset)) - if err != nil { - return nil, err + var n, tmpN int + for n != int(fragOffset) { + tmpN, err = fragRdr.Read(make([]byte, int(fragOffset)-n)) + if err != nil { + return nil, err + } + n += tmpN } fragRdr = io.LimitReader(fragRdr, int64(fragSize)) return fragRdr, nil @@ -72,9 +76,13 @@ func (r Reader) getReaders(i inode.Inode) (full *data.FullReader, rdr *data.Read if err != nil { return nil, nil, err } - _, err = fragRdr.Read(make([]byte, fragOffset)) - if err != nil { - return nil, nil, err + var n, tmpN int + for n != int(fragOffset) { + tmpN, err = fragRdr.Read(make([]byte, int(fragOffset)-n)) + if err != nil { + return nil, nil, err + } + n += tmpN } fragRdr = io.LimitReader(fragRdr, int64(fragSize)) rdr.AddFragment(fragRdr) diff --git a/squashfs_test.go b/squashfs_test.go index 76271a7..6d15bb8 100644 --- a/squashfs_test.go +++ b/squashfs_test.go @@ -19,9 +19,9 @@ import ( const ( squashfsURL = "https://darkstorm.tech/LinuxPATest.sfs" - squashfsName = "out.sfs" + squashfsName = "LinuxPATest.sfs" - filePath = "PortableApps/Desktop.ini" + filePath = "PortableApps/Notepad++Portable/App/DefaultData/Config/contextMenu.xml" ) func preTest(dir string) (fil *os.File, err error) { @@ -153,6 +153,7 @@ func TestSingleFile(t *testing.T) { if err != nil { t.Fatal(err) } + os.Remove(filepath.Base(filePath)) rdr, err := squashfs.NewReader(fil) if err != nil { t.Fatal(err)