From 40b776972326d3c673d3fb1c158b1e20dde8a95b Mon Sep 17 00:00:00 2001 From: rubidium Date: Wed, 21 Jan 2009 12:23:08 +0000 Subject: [PATCH] (svn r15195) -Fix: don't crash when removing from something you're iterating over --- src/network/network_content.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index 66c2c2d5d5..f0521f0b5d 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -750,29 +750,37 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(ContentInfo *ci) void ClientNetworkContentSocketHandler::OnConnect(bool success) { - for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); iter++) { - (*iter)->OnConnect(success); + for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); /* nothing */) { + ContentCallback *cb = *iter; + cb->OnConnect(success); + if (*iter != cb) iter++; } } void ClientNetworkContentSocketHandler::OnDisconnect() { - for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); iter++) { - (*iter)->OnDisconnect(); + for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); /* nothing */) { + ContentCallback *cb = *iter; + cb->OnDisconnect(); + if (*iter != cb) iter++; } } void ClientNetworkContentSocketHandler::OnReceiveContentInfo(const ContentInfo *ci) { - for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); iter++) { - (*iter)->OnReceiveContentInfo(ci); + for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); /* nothing */) { + ContentCallback *cb = *iter; + cb->OnReceiveContentInfo(ci); + if (*iter != cb) iter++; } } void ClientNetworkContentSocketHandler::OnDownloadProgress(const ContentInfo *ci, uint bytes) { - for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); iter++) { - (*iter)->OnDownloadProgress(ci, bytes); + for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); /* nothing */) { + ContentCallback *cb = *iter; + cb->OnDownloadProgress(ci, bytes); + if (*iter != cb) iter++; } } @@ -783,8 +791,10 @@ void ClientNetworkContentSocketHandler::OnDownloadComplete(ContentID cid) ci->state = ContentInfo::ALREADY_HERE; } - for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); iter++) { - (*iter)->OnDownloadComplete(cid); + for (ContentCallback **iter = this->callbacks.Begin(); iter != this->callbacks.End(); /* nothing */) { + ContentCallback *cb = *iter; + cb->OnDownloadComplete(cid); + if (*iter != cb) iter++; } }