From d935a4f0a80cc8acb2a067d7644ad807b1e0fa4d Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 10 Oct 2017 13:48:56 +0400 Subject: [PATCH] recover from panic in WS JSON RPC readRoutine https://github.com/tendermint/tendermint/pull/724#issuecomment-335316484 --- rpc/lib/server/handlers.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/rpc/lib/server/handlers.go b/rpc/lib/server/handlers.go index d8ba7dba0..d3d1b5042 100644 --- a/rpc/lib/server/handlers.go +++ b/rpc/lib/server/handlers.go @@ -8,6 +8,7 @@ import ( "io/ioutil" "net/http" "reflect" + "runtime/debug" "sort" "strings" "time" @@ -486,7 +487,17 @@ func (wsc *wsConnection) TryWriteRPCResponse(resp types.RPCResponse) bool { // Read from the socket and subscribe to or unsubscribe from events func (wsc *wsConnection) readRoutine() { defer func() { - wsc.baseConn.Close() + if r := recover(); r != nil { + err, ok := r.(error) + if !ok { + err = fmt.Errorf("WSJSONRPC: %v", r) + } + wsc.Logger.Error("Panic in WSJSONRPC handler", "err", err, "stack", string(debug.Stack())) + wsc.WriteRPCResponse(types.RPCInternalError("unknown", err)) + go wsc.readRoutine() + } else { + wsc.baseConn.Close() + } }() wsc.baseConn.SetPongHandler(func(m string) error {