X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/d7548c16cdbff6f9baa2f545eb808030a6b3ec2e..37a954c82b1e58d94bdb72c9fbdfc49c49785111:/hotline/server.go?ds=sidebyside diff --git a/hotline/server.go b/hotline/server.go index cf022fc..bace986 100644 --- a/hotline/server.go +++ b/hotline/server.go @@ -478,6 +478,15 @@ const ( minTransactionLen = 22 // minimum length of any transaction ) +// dontPanic recovers and logs panics instead of crashing +// TODO: remove this after known issues are fixed +func dontPanic(logger *zap.SugaredLogger) { + if r := recover(); r != nil { + fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) + logger.Errorw("PANIC", "err", r, "trace", string(debug.Stack())) + } +} + // handleNewConnection takes a new net.Conn and performs the initial login sequence func (s *Server) handleNewConnection(conn net.Conn) error { handshakeBuf := make([]byte, 12) // handshakes are always 12 bytes in length @@ -503,14 +512,9 @@ func (s *Server) handleNewConnection(conn net.Conn) error { } c := s.NewClientConn(conn) + defer c.Disconnect() - defer func() { - if r := recover(); r != nil { - fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) - c.Server.Logger.Errorw("PANIC", "err", r, "trace", string(debug.Stack())) - c.Disconnect() - } - }() + defer dontPanic(s.Logger) encodedLogin := clientLogin.GetField(fieldUserLogin).Data encodedPassword := clientLogin.GetField(fieldUserPassword).Data @@ -652,12 +656,7 @@ func (s *Server) handleFileTransfer(conn io.ReadWriteCloser) error { } }() - defer func() { - if r := recover(); r != nil { - fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) - s.Logger.Errorw("PANIC", "err", r, "trace", string(debug.Stack())) - } - }() + defer dontPanic(s.Logger) txBuf := make([]byte, 16) if _, err := io.ReadFull(conn, txBuf); err != nil {