From 09bec79b473fad40268f7b25b92c4979563829c4 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 4 Mar 2014 04:14:17 -0500 Subject: Fix 2 crashes from removing the permanent channel mode from channels which do not exist --- src/channels.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/channels.cpp b/src/channels.cpp index a9ad68b93..86c261029 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -111,7 +111,8 @@ void Channel::CheckModes() return; } - FOREACH_MOD(OnCheckModes, (this)); + Reference ref = this; + FOREACH_MOD(OnCheckModes, (ref)); } bool Channel::CheckDelete() @@ -371,6 +372,15 @@ void Channel::RemoveModeInternal(MessageSource &setter, ChannelMode *cm, const A FOREACH_RESULT(OnChannelModeUnset, MOD_RESULT, (this, setter, cm, param)); + if (cm->name == "PERM") + { + if (this->CheckDelete()) + { + delete this; + return; + } + } + /* Check for mlock */ if (!enforce_mlock || MOD_RESULT == EVENT_STOP) return; @@ -505,9 +515,11 @@ void Channel::SetModes(BotInfo *bi, bool enforce_mlock, const char *cmodes, ...) vsnprintf(buf, BUFSIZE - 1, cmodes, args); va_end(args); + Reference this_reference(this); + spacesepstream sep(buf); sep.GetToken(modebuf); - for (unsigned i = 0, end = modebuf.length(); i < end; ++i) + for (unsigned i = 0, end = modebuf.length(); this_reference && i < end; ++i) { ChannelMode *cm; -- cgit