From 5a8fca25f70325359436591185378088b35339d9 Mon Sep 17 00:00:00 2001 From: zeripath Date: Sun, 6 Feb 2022 19:28:25 +0000 Subject: [PATCH] If rendering has failed due to a net.OpError stop rendering (#18642) Backport #18642 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 dd571b4d78776..c7b9c0615ce1b 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" @@ -264,6 +266,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 }