Skip to content
This repository was archived by the owner on Nov 7, 2022. It is now read-only.

Commit ad64e43

Browse files
committed
internal/config: fix nil OpenCensus receiver dereference
An embarrasing non-defensive nil dereference if Config.Receivers.OpenCensus was nil then either of: * CanRunOpenCensusTraceReceiver * CanRunOpenCensusMetricsReceiver were invoked. Fixes #377
1 parent 85ab293 commit ad64e43

2 files changed

Lines changed: 39 additions & 2 deletions

File tree

internal/config/config.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,15 @@ func (c *Config) OpenCensusReceiverCorsAllowedOrigins() []string {
182182
// CanRunOpenCensusTraceReceiver returns true if the configuration
183183
// permits running the OpenCensus Trace receiver.
184184
func (c *Config) CanRunOpenCensusTraceReceiver() bool {
185-
return c != nil && c.Receivers != nil && !c.Receivers.OpenCensus.DisableTracing
185+
return c != nil && c.Receivers != nil &&
186+
c.Receivers.OpenCensus != nil && !c.Receivers.OpenCensus.DisableTracing
186187
}
187188

188189
// CanRunOpenCensusMetricsReceiver returns true if the configuration
189190
// permits running the OpenCensus Metrics receiver.
190191
func (c *Config) CanRunOpenCensusMetricsReceiver() bool {
191-
return c != nil && c.Receivers != nil && !c.Receivers.OpenCensus.DisableMetrics
192+
return c != nil && c.Receivers != nil &&
193+
c.Receivers.OpenCensus != nil && !c.Receivers.OpenCensus.DisableMetrics
192194
}
193195

194196
// ZPagesDisabled returns true if zPages have not been enabled.

internal/config/config_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,38 @@ exporters:
6161
t.Errorf("Exporters.Zipkin.EndpointURL mismatch\nGot: %s\nWant:%s", g, w)
6262
}
6363
}
64+
65+
// Issue #377: If Config.OpenCensus == nil, invoking
66+
// CanRunOpenCensus{Metrics, Trace}Receiver() would crash.
67+
func TestOpenCensusTraceReceiverEnabledNoCrash(t *testing.T) {
68+
// 1. Test with an in-code struct.
69+
cfg := &config.Config{
70+
Receivers: &config.Receivers{
71+
OpenCensus: nil,
72+
},
73+
}
74+
if cfg.CanRunOpenCensusTraceReceiver() {
75+
t.Fatal("CanRunOpenCensusTraceReceiver: Unexpected True for a nil Receiver.OpenCensus")
76+
}
77+
if cfg.CanRunOpenCensusMetricsReceiver() {
78+
t.Fatal("CanRunOpenCensusMetricsReceiver: Unexpected True for a nil Receiver.OpenCensus")
79+
}
80+
81+
// 2. Test with a struct unmarshalled from a configuration file's YAML.
82+
regressionYAML := []byte(`
83+
receivers:
84+
zipkin:
85+
address: "localhost:9410"`)
86+
87+
cfg, err := config.ParseOCAgentConfig(regressionYAML)
88+
if err != nil {
89+
t.Fatalf("Unexpected YAML parse error: %v", err)
90+
}
91+
92+
if cfg.CanRunOpenCensusTraceReceiver() {
93+
t.Fatal("yaml.CanRunOpenCensusTraceReceiver: Unexpected True for a nil Receiver.OpenCensus")
94+
}
95+
if cfg.CanRunOpenCensusMetricsReceiver() {
96+
t.Fatal("yaml.CanRunOpenCensusMetricsReceiver: Unexpected True for a nil Receiver.OpenCensus")
97+
}
98+
}

0 commit comments

Comments
 (0)