From 30b7a1e65b3c51b521e93549d900aa09149e1707 Mon Sep 17 00:00:00 2001 From: Julian Brost Date: Mon, 11 Jan 2021 18:11:48 +0100 Subject: [PATCH] Use reference-counted pointer in notification callback `this` could be deleted after `Notification::BeginExecuteNotification` exited and before `Notification::ExecuteNotificationHelper` finished. This is fixed by constructing a `Notification::Ptr` and operate on that one as it is properly reference-counted. --- lib/icinga/notification.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index 7555b457c..5f465a51a 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -431,7 +431,11 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe << "Sending " << (reminder ? "reminder " : "") << "'" << NotificationTypeToString(type) << "' notification '" << notificationName << "' for user '" << userName << "'"; - Utility::QueueAsyncCallback(std::bind(&Notification::ExecuteNotificationHelper, this, type, user, cr, force, author, text)); + // Explicitly use Notification::Ptr to keep the reference counted while the callback is active + Notification::Ptr notification (this); + Utility::QueueAsyncCallback([notification, type, user, cr, force, author, text]() { + notification->ExecuteNotificationHelper(type, user, cr, force, author, text); + }); /* collect all notified users */ allNotifiedUsers.insert(user);