Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 54d193a3df | |||
| a129b259be |
@@ -16,15 +16,17 @@ type Reader struct {
|
|||||||
blockSizes []uint32
|
blockSizes []uint32
|
||||||
blockSize uint32
|
blockSize uint32
|
||||||
resetable bool
|
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{
|
return &Reader{
|
||||||
d: d,
|
d: d,
|
||||||
master: r,
|
master: r,
|
||||||
blockSizes: blockSizes,
|
blockSizes: blockSizes,
|
||||||
blockSize: blockSize,
|
blockSize: blockSize,
|
||||||
resetable: true,
|
resetable: true,
|
||||||
|
fileSize: fileSize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,7 +51,11 @@ func (r *Reader) advance() (err error) {
|
|||||||
} else {
|
} else {
|
||||||
size := realSize(r.blockSizes[0])
|
size := realSize(r.blockSizes[0])
|
||||||
if size == 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 {
|
} else {
|
||||||
r.cur = io.LimitReader(r.master, int64(size))
|
r.cur = io.LimitReader(r.master, int64(size))
|
||||||
if size == r.blockSizes[0] {
|
if size == r.blockSizes[0] {
|
||||||
|
|||||||
+5
-1
@@ -1,6 +1,7 @@
|
|||||||
package squashfs
|
package squashfs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/CalebQ42/squashfs/internal/toreader"
|
"github.com/CalebQ42/squashfs/internal/toreader"
|
||||||
@@ -12,8 +13,11 @@ type fragEntry struct {
|
|||||||
_ uint32
|
_ 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)
|
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))
|
rdr := io.LimitReader(toreader.NewReader(r.r, int64(r.fragEntries[index].Start)), int64(realSize))
|
||||||
if realSize != r.fragEntries[index].Size {
|
if realSize != r.fragEntries[index].Size {
|
||||||
return rdr, nil
|
return rdr, nil
|
||||||
|
|||||||
+3
-3
@@ -54,12 +54,12 @@ func (r Reader) getReaders(i inode.Inode) (full *data.FullReader, rdr *data.Read
|
|||||||
} else {
|
} else {
|
||||||
return nil, nil, errors.New("getReaders called on non-file type")
|
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)
|
full = data.NewFullReader(r.r, uint64(blockOffset), r.d, blockSizes, r.s.BlockSize, fileSize)
|
||||||
if fragInd != 0xFFFFFFFF {
|
if fragInd != 0xFFFFFFFF {
|
||||||
full.AddFragment(func() (io.Reader, error) {
|
full.AddFragment(func() (io.Reader, error) {
|
||||||
var fragRdr io.Reader
|
var fragRdr io.Reader
|
||||||
fragRdr, err = r.fragReader(fragInd)
|
fragRdr, err = r.fragReader(fragInd, fragSize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -75,7 +75,7 @@ func (r Reader) getReaders(i inode.Inode) (full *data.FullReader, rdr *data.Read
|
|||||||
return fragRdr, nil
|
return fragRdr, nil
|
||||||
})
|
})
|
||||||
var fragRdr io.Reader
|
var fragRdr io.Reader
|
||||||
fragRdr, err = r.fragReader(fragInd)
|
fragRdr, err = r.fragReader(fragInd, fragSize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user