Fix nil-pointer panic in collectEvents for disabled input plugins

InputUnifi.Events returns (nil, nil) when disabled, but collectEvents
dereferenced e.Logs unconditionally after a successful (err == nil)
call, crashing the poller. Same crash class as #1030, found while
verifying the recover-based fix.
This commit is contained in:
Cody Lee
2026-08-18 08:36:50 -05:00
parent 8063f06777
commit 12073ba523
2 changed files with 38 additions and 0 deletions
+6
View File
@@ -183,6 +183,12 @@ func collectEvents(filter *Filter, inputs []*InputPlugin) (*Events, error) {
return
}
if e == nil {
resultChan <- eventInputResult{}
return
}
resultChan <- eventInputResult{logs: e.Logs}
}(input)
}
+32
View File
@@ -46,6 +46,38 @@ func TestCollectMetricsRecoversPanickingInput(t *testing.T) {
assert.Contains(t, err.Error(), "panic-input")
}
// nilEventsInput simulates a disabled input plugin, which returns (nil, nil)
// from Events. See https://github.com/unpoller/unpoller/issues/1030.
type nilEventsInput struct{}
func (nilEventsInput) Initialize(poller.Logger) error { return nil }
func (nilEventsInput) Metrics(*poller.Filter) (*poller.Metrics, error) { return nil, nil }
func (nilEventsInput) Events(*poller.Filter) (*poller.Events, error) { return nil, nil }
func (nilEventsInput) RawMetrics(*poller.Filter) ([]byte, error) { return nil, nil }
func (nilEventsInput) DebugInput() (bool, error) { return false, nil }
func TestCollectEventsHandlesNilEventsResult(t *testing.T) {
t.Parallel()
collector := poller.NewTestCollector(t)
collector.AddInput(&poller.InputPlugin{Name: "nil-events-input", Input: nilEventsInput{}})
var events *poller.Events
var err error
require.NotPanics(t, func() {
events, err = collector.Events(nil)
})
assert.NotNil(t, events)
require.NoError(t, err)
}
func TestCollectEventsRecoversPanickingInput(t *testing.T) {
t.Parallel()