Fix potential resource leak by ensuring the response body is closed in HTTPReadSeeker (#4605)

This commit is contained in:
Milos Gajdos 2025-03-20 13:02:42 -07:00 committed by GitHub
commit c6d55cb1a9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -165,7 +165,7 @@ func (hrs *HTTPReadSeeker) reset() {
}
}
func (hrs *HTTPReadSeeker) reader() (io.Reader, error) {
func (hrs *HTTPReadSeeker) reader() (_ io.Reader, retErr error) {
if hrs.err != nil {
return nil, hrs.err
}
@ -191,6 +191,11 @@ func (hrs *HTTPReadSeeker) reader() (io.Reader, error) {
if err != nil {
return nil, err
}
defer func() {
if retErr != nil {
_ = resp.Body.Close()
}
}()
// Normally would use client.SuccessStatus, but that would be a cyclic
// import
@ -276,8 +281,11 @@ func (hrs *HTTPReadSeeker) reader() (io.Reader, error) {
hrs.rc = body
} else {
defer resp.Body.Close()
if hrs.errorHandler != nil {
// Closing the body should be handled by the existing defer,
// but in case a custom "errHandler" is used that doesn't return
// an error, we close the body regardless.
defer resp.Body.Close()
return nil, hrs.errorHandler(resp)
}
return nil, fmt.Errorf("unexpected status resolving reader: %v", resp.Status)