From 4f3317effea38c203c358af9cb5ce3c0e4173976 Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Mon, 8 Nov 2021 08:41:27 -0800 Subject: [PATCH] Close stream on panic (#13605) Always close streamHTTPResponse on panic on main thread to avoid write/flush after response handler has returned. --- cmd/metacache-walk.go | 8 ++++++++ cmd/storage-rest-server.go | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/cmd/metacache-walk.go b/cmd/metacache-walk.go index b0999cdf8..02621aa59 100644 --- a/cmd/metacache-walk.go +++ b/cmd/metacache-walk.go @@ -19,9 +19,11 @@ package cmd import ( "context" + "fmt" "io" "net/http" "net/url" + "runtime/debug" "sort" "strconv" "strings" @@ -357,6 +359,12 @@ func (s *storageRESTServer) WalkDirHandler(w http.ResponseWriter, r *http.Reques prefix := r.Form.Get(storageRESTPrefixFilter) forward := r.Form.Get(storageRESTForwardFilter) writer := streamHTTPResponse(w) + defer func() { + if r := recover(); r != nil { + debug.PrintStack() + writer.CloseWithError(fmt.Errorf("panic: %v", r)) + } + }() writer.CloseWithError(s.storage.WalkDir(r.Context(), WalkDirOptions{ Bucket: volume, BaseDir: dirPath, diff --git a/cmd/storage-rest-server.go b/cmd/storage-rest-server.go index db258869f..09b1da024 100644 --- a/cmd/storage-rest-server.go +++ b/cmd/storage-rest-server.go @@ -30,6 +30,7 @@ import ( "net/http" "os/user" "path" + "runtime/debug" "strconv" "strings" "sync" @@ -177,6 +178,12 @@ func (s *storageRESTServer) NSScannerHandler(w http.ResponseWriter, r *http.Requ ctx, cancel := context.WithCancel(r.Context()) defer cancel() resp := streamHTTPResponse(w) + defer func() { + if r := recover(); r != nil { + debug.PrintStack() + resp.CloseWithError(fmt.Errorf("panic: %v", r)) + } + }() respW := msgp.NewWriter(resp) // Collect updates, stream them before the full cache is sent.