From 1037853571c9872bda2c63f2217c0353e1b5969f Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Sun, 6 Feb 2022 15:42:01 +0000 Subject: [PATCH] If rendering has failed due to a net.OpError stop rendering When a net.OpError occurs during rendering the underlying connection is essentially dead and therefore attempting to render further data will only cause further errors. Therefore in serverErrorInternal detect if the passed in error is an OpError and if so do not attempt any further rendering. Fix #18629 Signed-off-by: Andrew Thornton --- modules/context/context.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/context/context.go b/modules/context/context.go index 6c7f648519a1e..887cffdbf992e 100644 --- a/modules/context/context.go +++ b/modules/context/context.go @@ -9,9 +9,11 @@ import ( "context" "crypto/sha256" "encoding/hex" + "errors" "html" "html/template" "io" + "net" "net/http" "net/url" "path" @@ -265,6 +267,12 @@ func (ctx *Context) ServerError(logMsg string, logErr error) { func (ctx *Context) serverErrorInternal(logMsg string, logErr error) { if logErr != nil { log.ErrorWithSkip(2, "%s: %v", logMsg, logErr) + if errors.Is(logErr, &net.OpError{}) { + // This is an error within the underlying connection + // and further rendering will not work so just return + return + } + if !setting.IsProd { ctx.Data["ErrorMsg"] = logErr }