Skip to content

Commit a3a509a

Browse files
authored
Merge pull request #1865 from mrueg/gosec
Harden and add gosec linter
2 parents 80f0366 + 6b7027f commit a3a509a

File tree

11 files changed

+70
-22
lines changed

11 files changed

+70
-22
lines changed

.golangci.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ linters:
88
- gocyclo
99
- gofmt
1010
- goimports
11+
- gosec
1112
- gosimple
1213
- govet
1314
- ineffassign
@@ -28,3 +29,7 @@ issues:
2829
- path: _test\.go
2930
linters:
3031
- promlinter
32+
# TODO(mrueg) Improve error handling
33+
- text: "G104:"
34+
linters:
35+
- gosec

internal/store/job.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,8 @@ func jobMetricFamilies(allowAnnotationsList, allowLabelsList []string) []generat
212212
}
213213
}
214214

215-
for _, condition := range j.Status.Conditions {
215+
for _, c := range j.Status.Conditions {
216+
condition := c
216217
if condition.Type == v1batch.JobFailed {
217218
reasonKnown := false
218219
for _, reason := range jobFailureReasons {

internal/store/secret.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ import (
3333

3434
var (
3535
descSecretAnnotationsName = "kube_secret_annotations"
36-
descSecretAnnotationsHelp = "Kubernetes annotations converted to Prometheus labels."
36+
descSecretAnnotationsHelp = "Kubernetes annotations converted to Prometheus labels." //nolint:gosec
3737
descSecretLabelsName = "kube_secret_labels"
38-
descSecretLabelsHelp = "Kubernetes labels converted to Prometheus labels."
38+
descSecretLabelsHelp = "Kubernetes labels converted to Prometheus labels." //nolint:gosec
3939
descSecretLabelsDefaultLabels = []string{"namespace", "secret"}
4040
)
4141

main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"fmt"
2222
"os"
23+
"path/filepath"
2324
"strings"
2425

2526
"github.com/prometheus/common/version"
@@ -74,7 +75,7 @@ func resolveCustomResourceConfig(opts *options.Options) (customresourcestate.Con
7475
return yaml.NewDecoder(strings.NewReader(s)), true
7576
}
7677
if file := opts.CustomResourceConfigFile; file != "" {
77-
f, err := os.Open(file)
78+
f, err := os.Open(filepath.Clean(file))
7879
if err != nil {
7980
klog.ErrorS(err, "Custom Resource State Metrics file could not be opened")
8081
klog.FlushAndExit(klog.ExitFlushTimeout, 1)

pkg/app/server.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,17 @@ func RunKubeStateMetrics(ctx context.Context, opts *options.Options, factories .
178178

179179
telemetryMux := buildTelemetryServer(ksmMetricsRegistry)
180180
telemetryListenAddress := net.JoinHostPort(opts.TelemetryHost, strconv.Itoa(opts.TelemetryPort))
181-
telemetryServer := http.Server{Handler: telemetryMux, Addr: telemetryListenAddress}
181+
telemetryServer := http.Server{
182+
Handler: telemetryMux,
183+
Addr: telemetryListenAddress,
184+
ReadHeaderTimeout: 5 * time.Second}
182185

183186
metricsMux := buildMetricsServer(m, durationVec)
184187
metricsServerListenAddress := net.JoinHostPort(opts.Host, strconv.Itoa(opts.Port))
185-
metricsServer := http.Server{Handler: metricsMux, Addr: metricsServerListenAddress}
188+
metricsServer := http.Server{
189+
Handler: metricsMux,
190+
Addr: metricsServerListenAddress,
191+
ReadHeaderTimeout: 5 * time.Second}
186192

187193
// Run Telemetry server
188194
{

pkg/app/server_test.go

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,10 @@ func BenchmarkKubeStateMetrics(b *testing.B) {
7373

7474
builder := store.NewBuilder()
7575
builder.WithMetrics(reg)
76-
builder.WithEnabledResources(options.DefaultResources.AsSlice())
76+
err := builder.WithEnabledResources(options.DefaultResources.AsSlice())
77+
if err != nil {
78+
b.Fatal(err)
79+
}
7780
builder.WithKubeClient(kubeClient)
7881
builder.WithSharding(0, 1)
7982
builder.WithContext(ctx)
@@ -118,7 +121,10 @@ func BenchmarkKubeStateMetrics(b *testing.B) {
118121

119122
b.StopTimer()
120123
buf := bytes.Buffer{}
121-
buf.ReadFrom(resp.Body)
124+
_, err := buf.ReadFrom(resp.Body)
125+
if err != nil {
126+
b.Fatal(err)
127+
}
122128
accumulatedContentLength += buf.Len()
123129
b.StartTimer()
124130
}
@@ -144,7 +150,10 @@ func TestFullScrapeCycle(t *testing.T) {
144150
reg := prometheus.NewRegistry()
145151
builder := store.NewBuilder()
146152
builder.WithMetrics(reg)
147-
builder.WithEnabledResources(options.DefaultResources.AsSlice())
153+
err = builder.WithEnabledResources(options.DefaultResources.AsSlice())
154+
if err != nil {
155+
t.Fatal(err)
156+
}
148157
builder.WithKubeClient(kubeClient)
149158
builder.WithNamespaces(options.DefaultNamespaces, "")
150159
builder.WithGenerateStoresFunc(builder.DefaultGenerateStoresFunc())
@@ -428,7 +437,10 @@ func TestShardingEquivalenceScrapeCycle(t *testing.T) {
428437
reg := prometheus.NewRegistry()
429438
unshardedBuilder := store.NewBuilder()
430439
unshardedBuilder.WithMetrics(reg)
431-
unshardedBuilder.WithEnabledResources(options.DefaultResources.AsSlice())
440+
err = unshardedBuilder.WithEnabledResources(options.DefaultResources.AsSlice())
441+
if err != nil {
442+
t.Fatal(err)
443+
}
432444
unshardedBuilder.WithKubeClient(kubeClient)
433445
unshardedBuilder.WithNamespaces(options.DefaultNamespaces, "")
434446
unshardedBuilder.WithFamilyGeneratorFilter(l)
@@ -441,7 +453,10 @@ func TestShardingEquivalenceScrapeCycle(t *testing.T) {
441453
regShard1 := prometheus.NewRegistry()
442454
shardedBuilder1 := store.NewBuilder()
443455
shardedBuilder1.WithMetrics(regShard1)
444-
shardedBuilder1.WithEnabledResources(options.DefaultResources.AsSlice())
456+
err = shardedBuilder1.WithEnabledResources(options.DefaultResources.AsSlice())
457+
if err != nil {
458+
t.Fatal(err)
459+
}
445460
shardedBuilder1.WithKubeClient(kubeClient)
446461
shardedBuilder1.WithNamespaces(options.DefaultNamespaces, "")
447462
shardedBuilder1.WithFamilyGeneratorFilter(l)
@@ -454,7 +469,10 @@ func TestShardingEquivalenceScrapeCycle(t *testing.T) {
454469
regShard2 := prometheus.NewRegistry()
455470
shardedBuilder2 := store.NewBuilder()
456471
shardedBuilder2.WithMetrics(regShard2)
457-
shardedBuilder2.WithEnabledResources(options.DefaultResources.AsSlice())
472+
err = shardedBuilder2.WithEnabledResources(options.DefaultResources.AsSlice())
473+
if err != nil {
474+
t.Fatal(err)
475+
}
458476
shardedBuilder2.WithKubeClient(kubeClient)
459477
shardedBuilder2.WithNamespaces(options.DefaultNamespaces, "")
460478
shardedBuilder2.WithFamilyGeneratorFilter(l)
@@ -591,7 +609,11 @@ func TestCustomResourceExtension(t *testing.T) {
591609
builder := store.NewBuilder()
592610
builder.WithCustomResourceStoreFactories(factories...)
593611
builder.WithMetrics(reg)
594-
builder.WithEnabledResources(resources)
612+
err := builder.WithEnabledResources(resources)
613+
if err != nil {
614+
t.Fatal(err)
615+
}
616+
595617
builder.WithKubeClient(kubeClient)
596618
builder.WithCustomResourceClients(customResourceClients)
597619
builder.WithNamespaces(options.DefaultNamespaces, "")

pkg/builder/builder_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,12 @@ var (
4040
func TestBuilderWithCustomStore(t *testing.T) {
4141
b := builder.NewBuilder()
4242
b.WithFamilyGeneratorFilter(generator.NewCompositeFamilyGeneratorFilter())
43-
b.WithEnabledResources([]string{"pods"})
44-
b.WithGenerateStoresFunc(customStore)
43+
err := b.WithEnabledResources([]string{"pods"})
44+
if err != nil {
45+
t.Fatal(err)
46+
}
4547

48+
b.WithGenerateStoresFunc(customStore)
4649
var fStores []*fakeStore
4750
for _, stores := range b.BuildStores() {
4851
for _, store := range stores {

pkg/metrics_store/metrics_writer_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ func TestWriteAllWithSingleStore(t *testing.T) {
7676
},
7777
},
7878
}
79-
for _, svc := range svcs {
79+
for _, s := range svcs {
80+
svc := s
8081
if err := store.Add(&svc); err != nil {
8182
t.Fatal(err)
8283
}
@@ -160,7 +161,8 @@ func TestWriteAllWithMultipleStores(t *testing.T) {
160161
},
161162
},
162163
}
163-
for _, svc := range svcs1 {
164+
for _, s := range svcs1 {
165+
svc := s
164166
if err := s1.Add(&svc); err != nil {
165167
t.Fatal(err)
166168
}
@@ -183,7 +185,8 @@ func TestWriteAllWithMultipleStores(t *testing.T) {
183185
},
184186
}
185187
s2 := metricsstore.NewMetricsStore([]string{"Info 1 about services", "Info 2 about services"}, genFunc)
186-
for _, svc := range svcs2 {
188+
for _, s := range svcs2 {
189+
svc := s
187190
if err := s2.Add(&svc); err != nil {
188191
t.Fatal(err)
189192
}

pkg/metricshandler/metrics_handler.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,10 @@ func (m *MetricsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
205205

206206
// In case we gzipped the response, we have to close the writer.
207207
if closer, ok := writer.(io.Closer); ok {
208-
closer.Close()
208+
err := closer.Close()
209+
if err != nil {
210+
klog.ErrorS(err, "Failed to close the writer")
211+
}
209212
}
210213
}
211214

@@ -226,7 +229,7 @@ func shardingSettingsFromStatefulSet(ss *appsv1.StatefulSet, podName string) (no
226229

227230
func detectNominalFromPod(statefulSetName, podName string) (int32, error) {
228231
nominalString := strings.TrimPrefix(podName, statefulSetName+"-")
229-
nominal, err := strconv.Atoi(nominalString)
232+
nominal, err := strconv.ParseInt(nominalString, 10, 32)
230233
if err != nil {
231234
return 0, fmt.Errorf("failed to detect shard index for Pod %s of StatefulSet %s, parsed %s: %w", podName, statefulSetName, nominalString, err)
232235
}

pkg/options/options.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,10 @@ func (o *Options) AddFlags() {
7979
klogFlags := flag.NewFlagSet("klog", flag.ExitOnError)
8080
klog.InitFlags(klogFlags)
8181
o.flags.AddGoFlagSet(klogFlags)
82-
o.flags.Lookup("logtostderr").Value.Set("true")
82+
err := o.flags.Lookup("logtostderr").Value.Set("true")
83+
if err != nil {
84+
klog.Error(err)
85+
}
8386
o.flags.Lookup("logtostderr").DefValue = "true"
8487
o.flags.Lookup("logtostderr").NoOptDefVal = "true"
8588

0 commit comments

Comments
 (0)