From 1b8a5dee958adc476839ea497e03315f75ee9cde Mon Sep 17 00:00:00 2001 From: chros Date: Wed, 24 Jan 2018 17:59:22 +0000 Subject: [PATCH] Fix race condition in CommandScheduler (See #22) --- src/rpc/command_scheduler.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/rpc/command_scheduler.cc b/src/rpc/command_scheduler.cc index 393de6a1c..cd477d075 100644 --- a/src/rpc/command_scheduler.cc +++ b/src/rpc/command_scheduler.cc @@ -63,15 +63,18 @@ CommandScheduler::insert(const std::string& key) { if (key.empty()) throw torrent::input_error("Scheduler received an empty key."); - iterator itr = find(key); - - if (itr == end()) - itr = base_type::insert(end(), NULL); - else - delete *itr; + CommandSchedulerItem* current = new CommandSchedulerItem(key); + current->slot() = std::bind(&CommandScheduler::call_item, this, current); - *itr = new CommandSchedulerItem(key); - (*itr)->slot() = std::bind(&CommandScheduler::call_item, this, *itr); + iterator itr = find(key); + if (itr == end()) { + itr = base_type::insert(end(), current); + } else { + // swap in fully initialized command, and THEN delete the replaced one + CommandSchedulerItem* old = *itr; + *itr = current; + delete old; + } return itr; }