From 4e49a25ba6d70cd1308e9ec01ec1dbafa8d4cde9 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Wed, 10 Mar 2021 23:04:16 -0500 Subject: [PATCH] fix #1570 Handle panics in rehash, even if it was triggered by SIGHUP --- irc/server.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/irc/server.go b/irc/server.go index d18787cf..1fece0c1 100644 --- a/irc/server.go +++ b/irc/server.go @@ -153,10 +153,8 @@ func (server *Server) Run() { return case <-server.rehashSignal: - go func() { - server.logger.Info("server", "Rehashing due to SIGHUP") - server.rehash() - }() + server.logger.Info("server", "Rehashing due to SIGHUP") + go server.rehash() } } } @@ -520,14 +518,24 @@ func (client *Client) getWhoisOf(target *Client, hasPrivs bool, rb *ResponseBuff // rehash reloads the config and applies the changes from the config file. func (server *Server) rehash() error { + // #1570; this needs its own panic handling because it can be invoked via SIGHUP + defer func() { + if r := recover(); r != nil { + if server.Config().Debug.recoverFromErrors { + server.logger.Error("internal", + fmt.Sprintf("Panic during rehash: %v\n%s", r, debug.Stack())) + } else { + panic(r) + } + } + }() + server.logger.Info("server", "Attempting rehash") // only let one REHASH go on at a time server.rehashMutex.Lock() defer server.rehashMutex.Unlock() - server.logger.Debug("server", "Got rehash lock") - config, err := LoadConfig(server.configFilename) if err != nil { server.logger.Error("server", "failed to load config file", err.Error())