Skip to content

Commit 5031e28

Browse files
RonFeddylandreimerink
authored andcommitted
ringbuf: fix read after close panic
Signed-off-by: Ron Federman <[email protected]>
1 parent ae22611 commit 5031e28

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

ringbuf/reader.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,13 @@ func (r *Reader) Close() error {
108108
r.mu.Lock()
109109
defer r.mu.Unlock()
110110

111-
return r.ring.Close()
111+
var err error
112+
if r.ring != nil {
113+
err = r.ring.Close()
114+
r.ring = nil
115+
}
116+
117+
return err
112118
}
113119

114120
// SetDeadline controls how long Read and ReadInto will block waiting for samples.

ringbuf/reader_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,42 @@ func TestReaderSetDeadline(t *testing.T) {
313313
}
314314
}
315315

316+
func TestReadAfterClose(t *testing.T) {
317+
testutils.SkipOnOldKernel(t, "5.8", "BPF ring buffer")
318+
319+
prog, events := mustOutputSamplesProg(t,
320+
sampleMessage{size: 5, flags: 0},
321+
sampleMessage{size: 5, flags: 0},
322+
)
323+
ret, _, err := prog.Test(internal.EmptyBPFContext)
324+
testutils.SkipIfNotSupported(t, err)
325+
if err != nil {
326+
t.Fatal(err)
327+
}
328+
if errno := syscall.Errno(-int32(ret)); errno != 0 {
329+
t.Fatal("Expected 0 as return value, got", errno)
330+
}
331+
rd, err := NewReader(events)
332+
if err != nil {
333+
t.Fatal(err)
334+
}
335+
336+
_, err = rd.Read()
337+
if err != nil {
338+
t.Error("Expected no error after first Read, got:", err)
339+
}
340+
341+
err = rd.Close()
342+
if err != nil {
343+
t.Error("Expected no error from Close, got: ", err)
344+
}
345+
346+
_, err = rd.Read()
347+
if err == nil || !errors.Is(err, ErrClosed) {
348+
t.Error("Expected ErrClosed but got: ", err)
349+
}
350+
}
351+
316352
func BenchmarkReader(b *testing.B) {
317353
testutils.SkipOnOldKernel(b, "5.8", "BPF ring buffer")
318354

0 commit comments

Comments
 (0)