From 38992dafcf74bc5dd3ba4ddd8844b28f79d24670 Mon Sep 17 00:00:00 2001 From: Erik Dubbelboer Date: Sat, 28 Aug 2021 11:54:58 +0200 Subject: [PATCH] Fix []byte reuse bug The return value of normalizePath should be a reusable []byte. Returning strSlash could cause the strSlash constant to be reused and resulted in very weird behavior. This specific case of normalizePath almost never happens which made it even harder to spot. The race detector on Windows was the only clue that something was happening: WARNING: DATA RACE Write at 0x000001d082e3 by goroutine 446: github.com/valyala/fasthttp.addLeadingSlash() D:/a/fasthttp/fasthttp/uri_windows.go:8 +0xa5 github.com/valyala/fasthttp.normalizePath() D:/a/fasthttp/fasthttp/uri.go:343 +0xbd github.com/valyala/fasthttp.(*URI).parse() D:/a/fasthttp/fasthttp/uri.go:314 +0x1606 github.com/valyala/fasthttp.(*URI).Parse() D:/a/fasthttp/fasthttp/uri.go:266 +0xb3 github.com/valyala/fasthttp.testURIPathNormalize() D:/a/fasthttp/fasthttp/uri_test.go:195 +0x47 github.com/valyala/fasthttp.TestURIPathNormalize() D:/a/fasthttp/fasthttp/uri_test.go:176 +0x38e testing.tRunner() C:/hostedtoolcache/windows/go/1.15.15/x64/src/testing/testing.go:1123 +0x202 Previous read at 0x000001d082e3 by goroutine 332: runtime.slicecopy() C:/hostedtoolcache/windows/go/1.15.15/x64/src/runtime/slice.go:246 +0x0 github.com/valyala/fasthttp.(*RequestHeader).AppendBytes() D:/a/fasthttp/fasthttp/header.go:1726 +0x24d github.com/valyala/fasthttp.(*RequestHeader).Header() D:/a/fasthttp/fasthttp/header.go:1698 +0x84 github.com/valyala/fasthttp.(*RequestHeader).Write() D:/a/fasthttp/fasthttp/header.go:1682 +0x10f github.com/valyala/fasthttp.(*Request).Write() D:/a/fasthttp/fasthttp/http.go:1370 +0x1ab github.com/valyala/fasthttp.testRequestSuccess() D:/a/fasthttp/fasthttp/http_test.go:1788 +0x32a github.com/valyala/fasthttp.TestRequestSuccess() D:/a/fasthttp/fasthttp/http_test.go:1678 +0x2dd testing.tRunner() C:/hostedtoolcache/windows/go/1.15.15/x64/src/testing/testing.go:1123 +0x202 --- uri.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uri.go b/uri.go index c468183..b57b1f7 100644 --- a/uri.go +++ b/uri.go @@ -390,7 +390,7 @@ func normalizePath(dst, src []byte) []byte { if n >= 0 && n+len(strSlashDotDot) == len(b) { nn := bytes.LastIndexByte(b[:n], '/') if nn < 0 { - return strSlash + return append(dst[:0], strSlash...) } b = b[:nn+1] }