mirror of
https://github.com/unpoller/unpoller.git
synced 2026-10-21 10:16:07 +02:00
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:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user