From db3ba775286aa4efce8fdd1c398bf2bd4dfba37d Mon Sep 17 00:00:00 2001 From: Matt Dainty Date: Mon, 6 Nov 2023 22:11:09 +0000 Subject: [PATCH] fix: Handle panic when unpack info is missing (#117) --- export_test.go | 3 +++ reader_test.go | 10 +++++++++- testdata/COMPRESS-492.7z | Bin 0 -> 39 bytes types.go | 9 +++++++-- 4 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 export_test.go create mode 100644 testdata/COMPRESS-492.7z diff --git a/export_test.go b/export_test.go new file mode 100644 index 0000000..7a0bdc8 --- /dev/null +++ b/export_test.go @@ -0,0 +1,3 @@ +package sevenzip + +var ErrMissingUnpackInfo = errMissingUnpackInfo diff --git a/reader_test.go b/reader_test.go index ce6e380..241d32c 100644 --- a/reader_test.go +++ b/reader_test.go @@ -47,6 +47,7 @@ func TestOpenReader(t *testing.T) { tables := []struct { name, file string volumes []string + err error }{ { name: "no header compression", @@ -140,6 +141,11 @@ func TestOpenReader(t *testing.T) { name: "issue 87", file: "issue87.7z", }, + { + name: "issue 113", + file: "COMPRESS-492.7z", + err: sevenzip.ErrMissingUnpackInfo, + }, } for _, table := range tables { @@ -149,7 +155,9 @@ func TestOpenReader(t *testing.T) { t.Parallel() r, err := sevenzip.OpenReader(filepath.Join("testdata", table.file)) if err != nil { - t.Fatal(err) + assert.ErrorIs(t, err, table.err) + + return } defer r.Close() diff --git a/testdata/COMPRESS-492.7z b/testdata/COMPRESS-492.7z new file mode 100644 index 0000000000000000000000000000000000000000..53edfbc920bfae73c13d89c14910025d7d00242f GIT binary patch literal 39 hcmXr7+Ou9=hJh*Ips^DJ6tF{S*}K0cFtTufcmSOJ27mwn literal 0 HcmV?d00001 diff --git a/types.go b/types.go index 12e0df8..51cb7d2 100644 --- a/types.go +++ b/types.go @@ -46,8 +46,9 @@ const ( ) var ( - errIncompleteRead = errors.New("sevenzip: incomplete read") - errUnexpectedID = errors.New("sevenzip: unexpected id") + errIncompleteRead = errors.New("sevenzip: incomplete read") + errUnexpectedID = errors.New("sevenzip: unexpected id") + errMissingUnpackInfo = errors.New("sevenzip: missing unpack info") ) func readUint64(r io.ByteReader) (uint64, error) { @@ -510,6 +511,10 @@ func readStreamsInfo(r util.Reader) (*streamsInfo, error) { } if id == idSubStreamsInfo { + if s.unpackInfo == nil { + return nil, errMissingUnpackInfo + } + if s.subStreamsInfo, err = readSubStreamsInfo(r, s.unpackInfo.folder); err != nil { return nil, err }