summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-13 09:51:41 +0300
committerPaul Buetow <paul@buetow.org>2026-05-13 09:51:41 +0300
commit66956756ba018ed32a455aa57f04517af2c7357f (patch)
tree6dc86c8f3f77c684c711775a62346648a1ab5ada
parent6c7a5d5fb3e88068799fb414e316b6bec31015e9 (diff)
fix: surface rb.Poll errors instead of silently dropping them
The libbpfgo RingBuffer.Poll() previously launched a background goroutine that could fail with a fatal C-level errno (e.g. EBADF, EPERM) and silently exit, causing BPF events to stop flowing with no diagnostic. Changes: - Patch ../libbpfgo (replace directive) so RingBuffer.Poll() returns a buffered <-chan error that the background goroutine sends to on failure. - In setupEventChannel, capture the error channel and spawn a monitoring goroutine that logs any poll error to stderr. - Update go.mod with the replace directive and drop the now-unused remote checksum entries from go.sum. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-rw-r--r--go.mod2
-rw-r--r--go.sum2
-rw-r--r--internal/ior_bpfsetup.go12
3 files changed, 13 insertions, 3 deletions
diff --git a/go.mod b/go.mod
index 7e68ecd..886c481 100644
--- a/go.mod
+++ b/go.mod
@@ -39,3 +39,5 @@ require (
golang.org/x/sys v0.41.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
)
+
+replace github.com/aquasecurity/libbpfgo => ../libbpfgo
diff --git a/go.sum b/go.sum
index 55dbc42..ecb8bf8 100644
--- a/go.sum
+++ b/go.sum
@@ -14,8 +14,6 @@ github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
-github.com/aquasecurity/libbpfgo v0.9.2-libbpf-1.5.1 h1:TDN+16Nim3gimjuTxd+sFhb4v06mEeYH0JfRWAFowA0=
-github.com/aquasecurity/libbpfgo v0.9.2-libbpf-1.5.1/go.mod h1:JQNC5NuGwyYC7IZum6JqPNVHarFAuab+h4lO6t0jIhc=
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
github.com/aymanbagabas/go-udiff v0.4.0 h1:TKnLPh7IbnizJIBKFWa9mKayRUBQ9Kh1BPCk6w2PnYM=
diff --git a/internal/ior_bpfsetup.go b/internal/ior_bpfsetup.go
index 885d321..7575700 100644
--- a/internal/ior_bpfsetup.go
+++ b/internal/ior_bpfsetup.go
@@ -88,13 +88,23 @@ func setupBPFModule(parentCtx context.Context, cfg flags.Config) (*bpf.Module, *
}
// setupEventChannel initialises the BPF ring-buffer and returns the event channel.
+// It starts polling the ring buffer and logs any fatal poll error to stderr so
+// that a background ring-buffer failure does not go completely unnoticed.
func setupEventChannel(bpfModule *bpf.Module) (chan []byte, error) {
ch := make(chan []byte, appconfig.DefaultChannelBufferSize)
rb, err := bpfModule.InitRingBuf("event_map", ch)
if err != nil {
return nil, err
}
- rb.Poll(300)
+ // Poll returns a channel that receives any fatal error from the background
+ // polling goroutine. Monitor it in a goroutine so the error is logged and
+ // does not silently drop events.
+ pollErrCh := rb.Poll(300)
+ go func() {
+ if err := <-pollErrCh; err != nil {
+ fmt.Fprintf(os.Stderr, "ior: ring buffer poll failed: %v\n", err)
+ }
+ }()
return ch, nil
}