From 8f099fcd2713d27b80e00dfbddfddaa38a16f50b Mon Sep 17 00:00:00 2001 From: lordwelch Date: Mon, 15 Feb 2021 21:30:46 -0800 Subject: [PATCH] Add error handling for decompression --- binutils.go | 18 +++++++++--------- lsf/lsf.go | 20 ++++++++++++++++---- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/binutils.go b/binutils.go index 574f175..bde1476 100644 --- a/binutils.go +++ b/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) } } diff --git a/lsf/lsf.go b/lsf/lsf.go index c29b8c1..16ed538 100644 --- a/lsf/lsf.go +++ b/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) + } } }