Fixed issues with fragments

This commit is contained in:
Caleb Gardner
2022-08-26 12:11:27 -05:00
parent 4efd2ee49d
commit 327781d86e
3 changed files with 21 additions and 12 deletions
+2 -2
View File
@@ -9,7 +9,7 @@ import (
type fileInit struct { type fileInit struct {
BlockStart uint32 BlockStart uint32
FragInd uint32 FragInd uint32
Offset uint32 FragOffset uint32
Size uint32 Size uint32
} }
@@ -24,7 +24,7 @@ type eFileInit struct {
Sparse uint64 Sparse uint64
LinkCount uint32 LinkCount uint32
FragInd uint32 FragInd uint32
Offset uint32 FragOffset uint32
XattrInd uint32 XattrInd uint32
} }
+16 -8
View File
@@ -37,13 +37,13 @@ func (r Reader) getReaders(i inode.Inode) (full *data.FullReader, rdr *data.Read
var fragInd uint32 var fragInd uint32
var fragSize uint32 var fragSize uint32
if i.Type == inode.Fil { 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) blockOffset = uint64(i.Data.(inode.File).BlockStart)
blockSizes = i.Data.(inode.File).BlockSizes blockSizes = i.Data.(inode.File).BlockSizes
fragInd = i.Data.(inode.File).FragInd fragInd = i.Data.(inode.File).FragInd
fragSize = i.Data.(inode.File).Size % r.s.BlockSize fragSize = i.Data.(inode.File).Size % r.s.BlockSize
} else if i.Type == inode.EFil { } 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 blockOffset = i.Data.(inode.EFile).BlockStart
blockSizes = i.Data.(inode.EFile).BlockSizes blockSizes = i.Data.(inode.EFile).BlockSizes
fragInd = i.Data.(inode.EFile).FragInd 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 { if err != nil {
return nil, err return nil, err
} }
_, err = fragRdr.Read(make([]byte, fragOffset)) var n, tmpN int
if err != nil { for n != int(fragOffset) {
return nil, err tmpN, err = fragRdr.Read(make([]byte, int(fragOffset)-n))
if err != nil {
return nil, err
}
n += tmpN
} }
fragRdr = io.LimitReader(fragRdr, int64(fragSize)) fragRdr = io.LimitReader(fragRdr, int64(fragSize))
return fragRdr, nil return fragRdr, nil
@@ -72,9 +76,13 @@ func (r Reader) getReaders(i inode.Inode) (full *data.FullReader, rdr *data.Read
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
_, err = fragRdr.Read(make([]byte, fragOffset)) var n, tmpN int
if err != nil { for n != int(fragOffset) {
return nil, nil, err tmpN, err = fragRdr.Read(make([]byte, int(fragOffset)-n))
if err != nil {
return nil, nil, err
}
n += tmpN
} }
fragRdr = io.LimitReader(fragRdr, int64(fragSize)) fragRdr = io.LimitReader(fragRdr, int64(fragSize))
rdr.AddFragment(fragRdr) rdr.AddFragment(fragRdr)
+3 -2
View File
@@ -19,9 +19,9 @@ import (
const ( const (
squashfsURL = "https://darkstorm.tech/LinuxPATest.sfs" 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) { func preTest(dir string) (fil *os.File, err error) {
@@ -153,6 +153,7 @@ func TestSingleFile(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
os.Remove(filepath.Base(filePath))
rdr, err := squashfs.NewReader(fil) rdr, err := squashfs.NewReader(fil)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)