From 304ba1fd6c0384d57acbd16e625184cc352dc46a Mon Sep 17 00:00:00 2001 From: Elias Ohm Date: Wed, 17 Apr 2019 22:31:42 +0200 Subject: [PATCH] Fix for double-free (and possibly other memory-corruption related) crashes at logrotate time this is a direct fix of the issue revealing the problem that leads to crash verification done with a patched icinga2 where the execution-order of the code lines of counter-parts involved in re-incrementing/decrementing Timer:Ptr is forced to be the one that leads to the obeserverd segfaults refs #6737 (cherry picked from commit 52e3db279ab9ff348456234b8a033e703c6f7580) --- lib/base/timer.cpp | 6 ++---- lib/base/timer.hpp | 2 +- test/base-timer.cpp | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/base/timer.cpp b/lib/base/timer.cpp index 2bcff3a4b..8feae7971 100644 --- a/lib/base/timer.cpp +++ b/lib/base/timer.cpp @@ -127,7 +127,7 @@ void Timer::UninitializeThread() void Timer::Call() { try { - OnTimerExpired(Timer::Ptr(this)); + OnTimerExpired(this); } catch (...) { InternalReschedule(true); @@ -318,8 +318,6 @@ void Timer::TimerThreadProc() continue; } - Timer::Ptr ptimer = timer; - /* Remove the timer from the list so it doesn't get called again * until the current call is completed. */ l_Timers.erase(timer); @@ -329,6 +327,6 @@ void Timer::TimerThreadProc() lock.unlock(); /* Asynchronously call the timer. */ - Utility::QueueAsyncCallback(std::bind(&Timer::Call, ptimer)); + Utility::QueueAsyncCallback(std::bind(&Timer::Call, timer)); } } diff --git a/lib/base/timer.hpp b/lib/base/timer.hpp index 96b775322..7950faf37 100644 --- a/lib/base/timer.hpp +++ b/lib/base/timer.hpp @@ -56,7 +56,7 @@ public: void Reschedule(double next = -1); double GetNext() const; - boost::signals2::signal OnTimerExpired; + boost::signals2::signal OnTimerExpired; private: double m_Interval{0}; /**< The interval of the timer. */ diff --git a/test/base-timer.cpp b/test/base-timer.cpp index a9500a203..81b303ff0 100644 --- a/test/base-timer.cpp +++ b/test/base-timer.cpp @@ -41,7 +41,7 @@ BOOST_AUTO_TEST_CASE(interval) int counter = 0; -static void Callback(const Timer::Ptr&) +static void Callback(const Timer * const&) { counter++; } -- 2.40.0