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