Add error handling for decompression
This commit is contained in:
parent
1523c67ee8
commit
8f099fcd27
18
binutils.go
18
binutils.go
@ -82,18 +82,18 @@ func MakeCompressionFlags(method CompressionMethod, level CompressionLevel) int
|
|||||||
return flags | int(level)
|
return flags | int(level)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Decompress(compressed io.Reader, uncompressedSize int, compressionFlags byte, chunked bool) io.ReadSeeker {
|
func Decompress(compressed io.Reader, uncompressedSize int, compressionFlags byte, chunked bool) (io.ReadSeeker, error) {
|
||||||
switch CompressionMethod(compressionFlags & 0x0f) {
|
switch CompressionMethod(compressionFlags & 0x0f) {
|
||||||
case CMNone:
|
case CMNone:
|
||||||
if v, ok := compressed.(io.ReadSeeker); ok {
|
if v, ok := compressed.(io.ReadSeeker); ok {
|
||||||
return v
|
return v, nil
|
||||||
}
|
}
|
||||||
panic(errors.New("compressed must be an io.ReadSeeker if there is no compression"))
|
return nil, errors.New("compressed must be an io.ReadSeeker if there is no compression")
|
||||||
|
|
||||||
case CMZlib:
|
case CMZlib:
|
||||||
zr, _ := zlib.NewReader(compressed)
|
zr, _ := zlib.NewReader(compressed)
|
||||||
v, _ := ioutil.ReadAll(zr)
|
v, _ := ioutil.ReadAll(zr)
|
||||||
return bytes.NewReader(v)
|
return bytes.NewReader(v), nil
|
||||||
|
|
||||||
case CMLZ4:
|
case CMLZ4:
|
||||||
if chunked {
|
if chunked {
|
||||||
@ -101,21 +101,21 @@ func Decompress(compressed io.Reader, uncompressedSize int, compressionFlags byt
|
|||||||
p := make([]byte, uncompressedSize)
|
p := make([]byte, uncompressedSize)
|
||||||
_, err := zr.Read(p)
|
_, err := zr.Read(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return nil, err
|
||||||
}
|
}
|
||||||
return bytes.NewReader(p)
|
return bytes.NewReader(p), nil
|
||||||
}
|
}
|
||||||
src, _ := ioutil.ReadAll(compressed)
|
src, _ := ioutil.ReadAll(compressed)
|
||||||
dst := make([]byte, uncompressedSize*2)
|
dst := make([]byte, uncompressedSize*2)
|
||||||
_, err := lz4.UncompressBlock(src, dst)
|
_, err := lz4.UncompressBlock(src, dst)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return bytes.NewReader(dst)
|
return bytes.NewReader(dst), nil
|
||||||
|
|
||||||
default:
|
default:
|
||||||
panic(fmt.Errorf("no decompressor found for this format: %v", compressionFlags))
|
return nil, fmt.Errorf("no decompressor found for this format: %v", compressionFlags)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
20
lsf/lsf.go
20
lsf/lsf.go
@ -678,7 +678,10 @@ func Read(r io.ReadSeeker) (lsgo.Resource, error) {
|
|||||||
uncompressed := lsgo.LimitReadSeeker(r, int64(hdr.StringsSizeOnDisk))
|
uncompressed := lsgo.LimitReadSeeker(r, int64(hdr.StringsSizeOnDisk))
|
||||||
|
|
||||||
if isCompressed {
|
if isCompressed {
|
||||||
uncompressed = lsgo.Decompress(uncompressed, int(hdr.StringsUncompressedSize), hdr.CompressionFlags, false)
|
uncompressed, err = lsgo.Decompress(uncompressed, int(hdr.StringsUncompressedSize), hdr.CompressionFlags, false)
|
||||||
|
if err != nil {
|
||||||
|
return lsgo.Resource{}, fmt.Errorf("decompressing LSF name failed: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// using (var nodesFile = new FileStream("names.bin", FileMode.Create, FileAccess.Write))
|
// using (var nodesFile = new FileStream("names.bin", FileMode.Create, FileAccess.Write))
|
||||||
@ -703,7 +706,10 @@ func Read(r io.ReadSeeker) (lsgo.Resource, error) {
|
|||||||
if hdr.NodesSizeOnDisk > 0 || hdr.NodesUncompressedSize > 0 {
|
if hdr.NodesSizeOnDisk > 0 || hdr.NodesUncompressedSize > 0 {
|
||||||
uncompressed := lsgo.LimitReadSeeker(r, int64(hdr.NodesSizeOnDisk))
|
uncompressed := lsgo.LimitReadSeeker(r, int64(hdr.NodesSizeOnDisk))
|
||||||
if isCompressed {
|
if isCompressed {
|
||||||
uncompressed = lsgo.Decompress(uncompressed, int(hdr.NodesUncompressedSize), hdr.CompressionFlags, hdr.Version >= lsgo.VerChunkedCompress)
|
uncompressed, err = lsgo.Decompress(uncompressed, int(hdr.NodesUncompressedSize), hdr.CompressionFlags, hdr.Version >= lsgo.VerChunkedCompress)
|
||||||
|
if err != nil {
|
||||||
|
return lsgo.Resource{}, fmt.Errorf("decompressing LSF nodes failed: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// using (var nodesFile = new FileStream("nodes.bin", FileMode.Create, FileAccess.Write))
|
// using (var nodesFile = new FileStream("nodes.bin", FileMode.Create, FileAccess.Write))
|
||||||
@ -729,7 +735,10 @@ func Read(r io.ReadSeeker) (lsgo.Resource, error) {
|
|||||||
if hdr.AttributesSizeOnDisk > 0 || hdr.AttributesUncompressedSize > 0 {
|
if hdr.AttributesSizeOnDisk > 0 || hdr.AttributesUncompressedSize > 0 {
|
||||||
var uncompressed io.ReadSeeker = lsgo.LimitReadSeeker(r, int64(hdr.AttributesSizeOnDisk))
|
var uncompressed io.ReadSeeker = lsgo.LimitReadSeeker(r, int64(hdr.AttributesSizeOnDisk))
|
||||||
if isCompressed {
|
if isCompressed {
|
||||||
uncompressed = lsgo.Decompress(uncompressed, int(hdr.AttributesUncompressedSize), hdr.CompressionFlags, hdr.Version >= lsgo.VerChunkedCompress)
|
uncompressed, err = lsgo.Decompress(uncompressed, int(hdr.AttributesUncompressedSize), hdr.CompressionFlags, hdr.Version >= lsgo.VerChunkedCompress)
|
||||||
|
if err != nil {
|
||||||
|
return lsgo.Resource{}, fmt.Errorf("decompressing LSF attributes failed: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// using (var attributesFile = new FileStream("attributes.bin", FileMode.Create, FileAccess.Write))
|
// using (var attributesFile = new FileStream("attributes.bin", FileMode.Create, FileAccess.Write))
|
||||||
@ -752,7 +761,10 @@ func Read(r io.ReadSeeker) (lsgo.Resource, error) {
|
|||||||
var uncompressed io.ReadSeeker = lsgo.LimitReadSeeker(r, int64(hdr.ValuesSizeOnDisk))
|
var uncompressed io.ReadSeeker = lsgo.LimitReadSeeker(r, int64(hdr.ValuesSizeOnDisk))
|
||||||
if hdr.ValuesSizeOnDisk > 0 || hdr.ValuesUncompressedSize > 0 {
|
if hdr.ValuesSizeOnDisk > 0 || hdr.ValuesUncompressedSize > 0 {
|
||||||
if isCompressed {
|
if isCompressed {
|
||||||
uncompressed = lsgo.Decompress(r, int(hdr.ValuesUncompressedSize), hdr.CompressionFlags, hdr.Version >= lsgo.VerChunkedCompress)
|
uncompressed, err = lsgo.Decompress(r, int(hdr.ValuesUncompressedSize), hdr.CompressionFlags, hdr.Version >= lsgo.VerChunkedCompress)
|
||||||
|
if err != nil {
|
||||||
|
return lsgo.Resource{}, fmt.Errorf("decompressing LSF values failed: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user