From 5574e5f6ee992eab3098d9a0ec1c94b710723a33 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Wed, 22 Jun 2022 15:47:22 -0400
Subject: [PATCH] scheduled_executor: prevent use-after-free in reschedule

Change-Id: Id9fe8099cc0e82845e2a2d1cb4c4128f281ba982
---
 src/scheduled_executor.cpp | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/src/scheduled_executor.cpp b/src/scheduled_executor.cpp
index 9e06f96b91..1fd05096c6 100644
--- a/src/scheduled_executor.cpp
+++ b/src/scheduled_executor.cpp
@@ -55,11 +55,9 @@ ScheduledExecutor::~ScheduledExecutor()
 void
 ScheduledExecutor::stop()
 {
-    {
-        std::lock_guard<std::mutex> lock(jobLock_);
-        *running_ = false;
-        jobs_.clear();
-    }
+    std::lock_guard<std::mutex> lock(jobLock_);
+    *running_ = false;
+    jobs_.clear();
     cv_.notify_all();
 }
 
@@ -67,11 +65,9 @@ void
 ScheduledExecutor::run(std::function<void()>&& job,
                        const char* filename, uint32_t linum)
 {
-    {
-        std::lock_guard<std::mutex> lock(jobLock_);
-        auto now = clock::now();
-        jobs_[now].emplace_back(std::move(job), filename, linum);
-    }
+    std::lock_guard<std::mutex> lock(jobLock_);
+    auto now = clock::now();
+    jobs_[now].emplace_back(std::move(job), filename, linum);
     cv_.notify_all();
 }
 
@@ -115,11 +111,11 @@ ScheduledExecutor::reschedule(std::shared_ptr<RepeatedTask> task, time_point t,
 void
 ScheduledExecutor::schedule(std::shared_ptr<Task> task, time_point t)
 {
-    {
-        std::lock_guard<std::mutex> lock(jobLock_);
-        jobs_[t].emplace_back([task = std::move(task), this] { task->run(name_.c_str()); },
-                              task->job().filename, task->job().linum);
-    }
+    const char* filename =  task->job().filename;
+    uint32_t linenum = task->job().linum;
+    std::lock_guard<std::mutex> lock(jobLock_);
+    jobs_[t].emplace_back([task = std::move(task), this] { task->run(name_.c_str()); },
+                            filename, linenum);
     cv_.notify_all();
 }
 
-- 
GitLab