From 4cf334be9501778585aa18a8965ba128e71d114e Mon Sep 17 00:00:00 2001 From: Erik Dubbelboer Date: Sat, 6 Jun 2026 17:29:55 +0800 Subject: [PATCH] =?UTF-8?q?bug:=20SetBodySizePoolLimit=20data=20race=20?= =?UTF-8?q?=E2=80=94=20plain=20int=20written=20without=20synchronization?= =?UTF-8?q?=20(#2252)=20(#2282)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/http.go b/http.go index 4682235..1e8c2bd 100644 --- a/http.go +++ b/http.go @@ -12,21 +12,22 @@ import ( "net" "os" "sync" + "sync/atomic" "time" "github.com/valyala/bytebufferpool" ) var ( - requestBodyPoolSizeLimit = -1 - responseBodyPoolSizeLimit = -1 + requestBodyPoolSizeLimit int64 = -1 + responseBodyPoolSizeLimit int64 = -1 ) // SetBodySizePoolLimit set the max body size for bodies to be returned to the pool. // If the body size is larger it will be released instead of put back into the pool for reuse. func SetBodySizePoolLimit(reqBodyLimit, respBodyLimit int) { - requestBodyPoolSizeLimit = reqBodyLimit - responseBodyPoolSizeLimit = respBodyLimit + atomic.StoreInt64(&requestBodyPoolSizeLimit, int64(reqBodyLimit)) + atomic.StoreInt64(&responseBodyPoolSizeLimit, int64(respBodyLimit)) } // Request represents HTTP request. @@ -1254,8 +1255,8 @@ func readMultipartForm(r io.Reader, boundary string, size, maxInMemoryFileSize i // Reset clears request contents. func (req *Request) Reset() { req.userValues.Reset() // it should be at the top, since some values might implement io.Closer interface - if requestBodyPoolSizeLimit >= 0 && req.body != nil { - req.ReleaseBody(requestBodyPoolSizeLimit) + if bodyPoolSizeLimit := int(atomic.LoadInt64(&requestBodyPoolSizeLimit)); bodyPoolSizeLimit >= 0 && req.body != nil { + req.ReleaseBody(bodyPoolSizeLimit) } req.Header.Reset() req.resetSkipHeader() @@ -1288,8 +1289,8 @@ func (req *Request) RemoveMultipartFormFiles() { // Reset clears response contents. func (resp *Response) Reset() { - if responseBodyPoolSizeLimit >= 0 && resp.body != nil { - resp.ReleaseBody(responseBodyPoolSizeLimit) + if bodyPoolSizeLimit := int(atomic.LoadInt64(&responseBodyPoolSizeLimit)); bodyPoolSizeLimit >= 0 && resp.body != nil { + resp.ReleaseBody(bodyPoolSizeLimit) } resp.resetSkipHeader() resp.Header.Reset()