From c704191e2cc887e00fa95c11e54f5dca063914d1 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 3 Sep 2023 01:32:25 +0300 Subject: [PATCH] Catch panics in portal message handler --- portal.go | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/portal.go b/portal.go index 527a2ea..38779fb 100644 --- a/portal.go +++ b/portal.go @@ -298,7 +298,7 @@ var ( _ bridge.TypingPortal = (*Portal)(nil) ) -func (portal *Portal) handleMessageLoopItem(msg PortalMessage) { +func (portal *Portal) handleWhatsAppMessageLoopItem(msg PortalMessage) { if len(portal.MXID) == 0 { if msg.fake == nil && msg.undecryptable == nil && (msg.evt == nil || !containsSupportedMessage(msg.evt.Message)) { portal.log.Debugln("Not creating portal room for incoming message: message is not a chat message") @@ -423,14 +423,31 @@ func (portal *Portal) handleReceipt(receipt *events.Receipt, source *User) { func (portal *Portal) handleMessageLoop() { for { - select { - case msg := <-portal.messages: - portal.handleMessageLoopItem(msg) - case msg := <-portal.matrixMessages: - portal.handleMatrixMessageLoopItem(msg) - case retry := <-portal.mediaRetries: - portal.handleMediaRetry(retry.evt, retry.source) + portal.handleOneMessageLoopItem() + } +} + +func (portal *Portal) handleOneMessageLoopItem() { + defer func() { + if err := recover(); err != nil { + logEvt := portal.zlog.WithLevel(zerolog.FatalLevel). + Str(zerolog.ErrorStackFieldName, string(debug.Stack())) + actualErr, ok := err.(error) + if ok { + logEvt = logEvt.Err(actualErr) + } else { + logEvt = logEvt.Any(zerolog.ErrorFieldName, err) + } + logEvt.Msg("Portal message handler panicked") } + }() + select { + case msg := <-portal.messages: + portal.handleWhatsAppMessageLoopItem(msg) + case msg := <-portal.matrixMessages: + portal.handleMatrixMessageLoopItem(msg) + case retry := <-portal.mediaRetries: + portal.handleMediaRetry(retry.evt, retry.source) } }