Skip to content

Commit dee4b29

Browse files
committed
Fix memory leak in TokenTransport
Close token-demand response before making auth-and-retry. Unclosed responses lead to unclosed sockets and to memory leaks in long running apps: ``` ... lrwx------ 1 root root 64 Mar 12 20:16 11 -> socket:[3213896] lrwx------ 1 root root 64 Mar 12 20:16 110 -> socket:[3238100] lrwx------ 1 root root 64 Mar 12 20:16 111 -> socket:[3238973] lrwx------ 1 root root 64 Mar 12 20:16 112 -> socket:[3238317] lrwx------ 1 root root 64 Mar 12 20:16 113 -> socket:[3239210] lrwx------ 1 root root 64 Mar 12 20:16 114 -> socket:[3239321] lrwx------ 1 root root 64 Mar 12 20:16 115 -> socket:[3239503] lrwx------ 1 root root 64 Mar 12 20:16 116 -> socket:[3239643] lrwx------ 1 root root 64 Mar 12 20:16 117 -> socket:[3238846] ... ```
1 parent fd2fe80 commit dee4b29

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

registry/tokentransport.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package registry
33
import (
44
"encoding/json"
55
"fmt"
6+
"io/ioutil"
67
"net/http"
78
"net/url"
89
)
@@ -19,6 +20,14 @@ func (t *TokenTransport) RoundTrip(req *http.Request) (*http.Response, error) {
1920
return resp, err
2021
}
2122
if authService := isTokenDemand(resp); authService != nil {
23+
_, err := ioutil.ReadAll(resp.Body)
24+
if err == nil {
25+
err = resp.Body.Close()
26+
}
27+
if err != nil {
28+
return nil, fmt.Errorf("http: failed to close token demand response (status=%v, err=%q)", resp.StatusCode, err)
29+
}
30+
2231
resp, err = t.authAndRetry(authService, req)
2332
}
2433
return resp, err

0 commit comments

Comments
 (0)