From 4704c91a8fd4ccc4279d32223ac97552719d12c4 Mon Sep 17 00:00:00 2001 From: rakshasa Date: Fri, 30 Nov 2007 14:33:20 +0000 Subject: [PATCH] * Fixed a crash in apply_on_ratio when an iterator got invalidated by erasing the download currently pointed to. git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@1015 e378c898-3ddf-0310-93e7-cc216c733640 --- src/command_events.cc | 17 +++++++++-------- src/core/download_list.h | 2 ++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/command_events.cc b/src/command_events.cc index 30f45c54..f64917f1 100644 --- a/src/command_events.cc +++ b/src/command_events.cc @@ -97,10 +97,11 @@ apply_on_ratio(int action, const torrent::Object& rawArgs) { core::DownloadList* downloadList = control->core()->download_list(); for (core::Manager::DListItr itr = downloadList->begin(); - (itr = std::find_if(itr, downloadList->end(), std::mem_fun(&core::Download::is_seeding))) != downloadList->end(); - itr++) { - int64_t totalDone = (*itr)->download()->bytes_done(); - int64_t totalUpload = (*itr)->download()->up_rate()->total(); + (itr = std::find_if(itr, downloadList->end(), std::mem_fun(&core::Download::is_seeding))) != downloadList->end(); ) { + core::Download* current = *itr++; + + int64_t totalDone = current->download()->bytes_done(); + int64_t totalUpload = current->download()->up_rate()->total(); if (!(totalUpload >= minUpload && totalUpload * 100 >= totalDone * minRatio) && !(maxRatio > 0 && totalUpload * 100 > totalDone * maxRatio)) @@ -109,18 +110,18 @@ apply_on_ratio(int action, const torrent::Object& rawArgs) { bool success; switch (action) { - case core::DownloadList::SLOTS_CLOSE: success = downloadList->close_try(*itr); break; - case core::DownloadList::SLOTS_STOP: success = downloadList->stop_try(*itr); break; + case core::DownloadList::SLOTS_CLOSE: success = downloadList->close_try(current); break; + case core::DownloadList::SLOTS_STOP: success = downloadList->stop_try(current); break; default: success = false; break; } if (!success) continue; - rpc::call_command("d.set_ignore_commands", (int64_t)1, rpc::make_target(*itr)); + rpc::call_command("d.set_ignore_commands", (int64_t)1, rpc::make_target(current)); for (torrent::Object::list_const_iterator itr2 = argItr; itr2 != args.end(); itr2++) - rpc::parse_command_object(rpc::make_target(*itr), *itr2); + rpc::parse_command_object(rpc::make_target(current), *itr2); } return torrent::Object(); diff --git a/src/core/download_list.h b/src/core/download_list.h index 2f704862..ee0855ff 100644 --- a/src/core/download_list.h +++ b/src/core/download_list.h @@ -54,6 +54,8 @@ class Download; // Container for all downloads. Add slots to the slot maps to cause // some action to be taken when the torrent changes states. Don't // change the states from outside of core. +// +// Fix apply_on_ratio if the base_type is changed. class DownloadList : private std::list { public: