diff --git a/internal/bra/reader.go b/internal/bra/reader.go index 733333b..0cbee98 100644 --- a/internal/bra/reader.go +++ b/internal/bra/reader.go @@ -43,6 +43,10 @@ func (rc *readCloser) Read(p []byte) (int, error) { return 0, fmt.Errorf("bra: error buffering: %w", err) } + if rc.buf.Len() == 0 { // Buffer is empty and read closer returned EOF; no more data available + return 0, io.EOF + } + if rc.buf.Len() < rc.conv.Size() { rc.n = rc.buf.Len() } diff --git a/reader_test.go b/reader_test.go index 771ba1f..58fa90f 100644 --- a/reader_test.go +++ b/reader_test.go @@ -434,6 +434,30 @@ func TestFS(t *testing.T) { } } +func TestRead(t *testing.T) { + t.Parallel() + + r, err := sevenzip.OpenReader(filepath.Join("testdata", "eof-read.7z")) + if err != nil { + t.Fatal(err) + } + + defer func() { + if err := r.Close(); err != nil { + t.Fatal(err) + } + }() + + file, err := r.Open("Plug 1.2/Plug 1.2.exe") + if err != nil { + t.Fatal(err) + } + _, err = io.ReadAll(file) + if err != nil { + t.Fatal(err) + } +} + func FuzzNewReaderWithPassword(f *testing.F) { b, err := os.ReadFile(filepath.Join("testdata", "copy.7z")) if err != nil { diff --git a/testdata/eof-read.7z b/testdata/eof-read.7z new file mode 100644 index 0000000..f330ab9 Binary files /dev/null and b/testdata/eof-read.7z differ