Browse Source

fix #1570

Handle panics in rehash, even if it was triggered by SIGHUP
tags/v2.6.0-rc1
Shivaram Lingamneni 3 years ago
parent
commit
4e49a25ba6
1 changed files with 14 additions and 6 deletions
  1. 14
    6
      irc/server.go

+ 14
- 6
irc/server.go View File

@@ -153,10 +153,8 @@ func (server *Server) Run() {
153 153
 			return
154 154
 
155 155
 		case <-server.rehashSignal:
156
-			go func() {
157
-				server.logger.Info("server", "Rehashing due to SIGHUP")
158
-				server.rehash()
159
-			}()
156
+			server.logger.Info("server", "Rehashing due to SIGHUP")
157
+			go server.rehash()
160 158
 		}
161 159
 	}
162 160
 }
@@ -520,14 +518,24 @@ func (client *Client) getWhoisOf(target *Client, hasPrivs bool, rb *ResponseBuff
520 518
 
521 519
 // rehash reloads the config and applies the changes from the config file.
522 520
 func (server *Server) rehash() error {
521
+	// #1570; this needs its own panic handling because it can be invoked via SIGHUP
522
+	defer func() {
523
+		if r := recover(); r != nil {
524
+			if server.Config().Debug.recoverFromErrors {
525
+				server.logger.Error("internal",
526
+					fmt.Sprintf("Panic during rehash: %v\n%s", r, debug.Stack()))
527
+			} else {
528
+				panic(r)
529
+			}
530
+		}
531
+	}()
532
+
523 533
 	server.logger.Info("server", "Attempting rehash")
524 534
 
525 535
 	// only let one REHASH go on at a time
526 536
 	server.rehashMutex.Lock()
527 537
 	defer server.rehashMutex.Unlock()
528 538
 
529
-	server.logger.Debug("server", "Got rehash lock")
530
-
531 539
 	config, err := LoadConfig(server.configFilename)
532 540
 	if err != nil {
533 541
 		server.logger.Error("server", "failed to load config file", err.Error())

Loading…
Cancel
Save