Skip to content

Commit b77ad89

Browse files
authored
lint: enable bodyclose (ensure response bodies are closed to avoid leaks) (#4200)
1 parent 56b1e05 commit b77ad89

5 files changed

Lines changed: 32 additions & 6 deletions

File tree

.golangci.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -522,11 +522,6 @@ linters:
522522
- govet
523523
text: 'shadow: declaration of "(err|ctx)" shadows declaration'
524524

525-
# https://github.com/timakin/bodyclose
526-
- linters:
527-
- bodyclose
528-
text: response body must be closed
529-
530525
- linters:
531526
- revive
532527
path: pkg/leakybucket/manager_load.go

cmd/crowdsec-cli/core/require/branch.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ func lookupLatest(ctx context.Context) (string, error) {
5656
if err != nil {
5757
return "", err
5858
}
59+
defer resp.Body.Close()
5960

6061
latest := make(map[string]any)
6162

cmd/notification-splunk/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ func (s *Splunk) Notify(ctx context.Context, notification *protobufs.Notificatio
7575
if err != nil {
7676
return &protobufs.Empty{}, err
7777
}
78+
defer resp.Body.Close()
7879

7980
if resp.StatusCode != http.StatusOK {
8081
content, err := io.ReadAll(resp.Body)

pkg/acquisition/modules/http/http_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ const (
3131
testHTTPServerAddrTLS = "https://127.0.0.1:8080"
3232
)
3333

34+
func closeBody(t *testing.T, resp *http.Response) {
35+
t.Helper()
36+
37+
if resp != nil && resp.Body != nil {
38+
_ = resp.Body.Close()
39+
}
40+
}
41+
3442
func TestGetUuid(t *testing.T) {
3543
h := Source{}
3644
h.Config.UniqueId = "test"
@@ -94,6 +102,7 @@ basic_auth:
94102
res, err := http.DefaultClient.Do(req)
95103
require.NoError(t, err)
96104
assert.Equal(t, http.StatusMethodNotAllowed, res.StatusCode)
105+
closeBody(t, res)
97106

98107
// Check that GET/HEAD requests return a 200
99108

@@ -103,13 +112,15 @@ basic_auth:
103112
res, err = http.DefaultClient.Do(req)
104113
require.NoError(t, err)
105114
assert.Equal(t, http.StatusOK, res.StatusCode)
115+
closeBody(t, res)
106116

107117
req, err = http.NewRequestWithContext(ctx, http.MethodHead, testHTTPServerAddr+"/test", http.NoBody)
108118
require.NoError(t, err)
109119
req.SetBasicAuth("test", "test")
110120
res, err = http.DefaultClient.Do(req)
111121
require.NoError(t, err)
112122
assert.Equal(t, http.StatusOK, res.StatusCode)
123+
closeBody(t, res)
113124

114125
h.Server.Close()
115126
tomb.Kill(nil)
@@ -138,6 +149,7 @@ basic_auth:
138149
res, err := http.DefaultClient.Do(req)
139150
require.NoError(t, err)
140151
assert.Equal(t, http.StatusNotFound, res.StatusCode)
152+
closeBody(t, res)
141153

142154
h.Server.Close()
143155
tomb.Kill(nil)
@@ -168,6 +180,7 @@ basic_auth:
168180
resp, err := http.DefaultClient.Do(req)
169181
require.NoError(t, err)
170182
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
183+
closeBody(t, resp)
171184

172185
req, err = http.NewRequestWithContext(ctx, http.MethodPost, testHTTPServerAddr+"/test", strings.NewReader("test"))
173186
require.NoError(t, err)
@@ -176,6 +189,7 @@ basic_auth:
176189
resp, err = client.Do(req)
177190
require.NoError(t, err)
178191
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
192+
closeBody(t, resp)
179193

180194
h.Server.Close()
181195
tomb.Kill(nil)
@@ -205,6 +219,7 @@ headers:
205219
resp, err := client.Do(req)
206220
require.NoError(t, err)
207221
assert.Equal(t, http.StatusUnauthorized, resp.StatusCode)
222+
closeBody(t, resp)
208223

209224
h.Server.Close()
210225
tomb.Kill(nil)
@@ -235,6 +250,7 @@ max_body_size: 5`), 0)
235250
require.NoError(t, err)
236251

237252
assert.Equal(t, http.StatusRequestEntityTooLarge, resp.StatusCode)
253+
closeBody(t, resp)
238254

239255
h.Server.Close()
240256
tomb.Kill(nil)
@@ -268,6 +284,7 @@ headers:
268284
resp, err := client.Do(req)
269285
require.NoError(t, err)
270286
assert.Equal(t, http.StatusOK, resp.StatusCode)
287+
closeBody(t, resp)
271288

272289
err = <-errChan
273290
require.NoError(t, err)
@@ -310,6 +327,7 @@ custom_headers:
310327

311328
assert.Equal(t, http.StatusCreated, resp.StatusCode)
312329
assert.Equal(t, "true", resp.Header.Get("Success"))
330+
closeBody(t, resp)
313331

314332
err = <-errChan
315333
require.NoError(t, err)
@@ -357,6 +375,7 @@ headers:
357375
require.NoError(t, err)
358376

359377
assert.Equal(t, http.StatusOK, resp.StatusCode)
378+
closeBody(t, resp)
360379

361380
err = <-errChan
362381
require.NoError(t, err)
@@ -455,6 +474,7 @@ timeout: 1s`), 0)
455474
require.NoError(t, err)
456475

457476
assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
477+
closeBody(t, resp)
458478

459479
h.Server.Close()
460480
tomb.Kill(nil)
@@ -486,6 +506,7 @@ tls:
486506
require.NoError(t, err)
487507

488508
assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
509+
closeBody(t, resp)
489510

490511
h.Server.Close()
491512
tomb.Kill(nil)
@@ -539,6 +560,7 @@ tls:
539560
require.NoError(t, err)
540561

541562
assert.Equal(t, http.StatusOK, resp.StatusCode)
563+
closeBody(t, resp)
542564

543565
err = <-errChan
544566
require.NoError(t, err)
@@ -599,6 +621,7 @@ tls:
599621
require.NoError(t, err)
600622

601623
assert.Equal(t, http.StatusOK, resp.StatusCode)
624+
closeBody(t, resp)
602625

603626
err = <-errChan
604627
require.NoError(t, err)
@@ -654,6 +677,7 @@ headers:
654677
require.NoError(t, err)
655678

656679
assert.Equal(t, http.StatusOK, resp.StatusCode)
680+
closeBody(t, resp)
657681

658682
err = <-errChan
659683
require.NoError(t, err)
@@ -695,6 +719,7 @@ headers:
695719
resp, err := client.Do(req)
696720
require.NoError(t, err)
697721
assert.Equal(t, http.StatusOK, resp.StatusCode)
722+
closeBody(t, resp)
698723

699724
err = <-errChan
700725
require.NoError(t, err)

pkg/acquisition/modules/loki/internal/lokiclient/loki_client.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,13 +264,17 @@ func (lc *LokiClient) Tail(ctx context.Context) (chan *LokiResponse, error) {
264264
}
265265
lc.Logger.Infof("Connecting to %s", u)
266266

267-
conn, _, err := dialer.Dial(u, requestHeader)
267+
conn, resp, err := dialer.Dial(u, requestHeader)
268+
if resp != nil && resp.Body != nil {
269+
_ = resp.Body.Close()
270+
}
268271
if err != nil {
269272
lc.Logger.Errorf("Error connecting to websocket, err: %s", err)
270273
return responseChan, errors.New("error connecting to websocket")
271274
}
272275

273276
lc.t.Go(func() error {
277+
defer conn.Close()
274278
for {
275279
jsonResponse := &LokiResponse{}
276280

0 commit comments

Comments
 (0)