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)
|
||||
}
|
||||
|
||||
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) {
|
||||
case CMNone:
|
||||
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:
|
||||
zr, _ := zlib.NewReader(compressed)
|
||||
v, _ := ioutil.ReadAll(zr)
|
||||
return bytes.NewReader(v)
|
||||
return bytes.NewReader(v), nil
|
||||
|
||||
case CMLZ4:
|
||||
if chunked {
|
||||
@ -101,21 +101,21 @@ func Decompress(compressed io.Reader, uncompressedSize int, compressionFlags byt
|
||||
p := make([]byte, uncompressedSize)
|
||||
_, err := zr.Read(p)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return nil, err
|
||||
}
|
||||
return bytes.NewReader(p)
|
||||
return bytes.NewReader(p), nil
|
||||
}
|
||||
src, _ := ioutil.ReadAll(compressed)
|
||||
dst := make([]byte, uncompressedSize*2)
|
||||
_, err := lz4.UncompressBlock(src, dst)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return bytes.NewReader(dst)
|
||||
return bytes.NewReader(dst), nil
|
||||
|
||||
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))
|
||||
|
||||
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))
|
||||
@ -703,7 +706,10 @@ func Read(r io.ReadSeeker) (lsgo.Resource, error) {
|
||||
if hdr.NodesSizeOnDisk > 0 || hdr.NodesUncompressedSize > 0 {
|
||||
uncompressed := lsgo.LimitReadSeeker(r, int64(hdr.NodesSizeOnDisk))
|
||||
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))
|
||||
@ -729,7 +735,10 @@ func Read(r io.ReadSeeker) (lsgo.Resource, error) {
|
||||
if hdr.AttributesSizeOnDisk > 0 || hdr.AttributesUncompressedSize > 0 {
|
||||
var uncompressed io.ReadSeeker = lsgo.LimitReadSeeker(r, int64(hdr.AttributesSizeOnDisk))
|
||||
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))
|
||||
@ -752,7 +761,10 @@ func Read(r io.ReadSeeker) (lsgo.Resource, error) {
|
||||
var uncompressed io.ReadSeeker = lsgo.LimitReadSeeker(r, int64(hdr.ValuesSizeOnDisk))
|
||||
if hdr.ValuesSizeOnDisk > 0 || hdr.ValuesUncompressedSize > 0 {
|
||||
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