summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-07-29 22:02:11 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-07-29 22:02:11 +0000
commitba1807932b9a22b58f3705d70b1b92b4cc959614 (patch)
tree48e71952370fba3d1b59ab749614f266df7583d4
parentc0449726a44c9772fe60d7994500c679c743c684 (diff)
Fix for bug which can lock up ircd if someone adds a timed ban when the banlist is full
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4589 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--src/modules/m_timedbans.cpp26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/modules/m_timedbans.cpp b/src/modules/m_timedbans.cpp
index b05cbf8f7..25dccde63 100644
--- a/src/modules/m_timedbans.cpp
+++ b/src/modules/m_timedbans.cpp
@@ -61,13 +61,9 @@ class cmd_tban : public command_t
Srv->SendServ(user->fd,"NOTICE "+std::string(user->nick)+" :Invalid ban mask");
return;
}
- for (timedbans::iterator i = TimedBanList.begin(); i < TimedBanList.end(); i++)
+ for (BanList::iterator i = channel->bans.begin(); i != channel->bans.end(); i++)
{
- irc::string listitem = i->mask.c_str();
- irc::string target = parameters[2];
- irc::string listchan = i->channel.c_str();
- irc::string targetchan = parameters[0];
- if ((listitem == target) && (listchan == targetchan))
+ if (!strcasecmp(i->data,parameters[2]))
{
Srv->SendServ(user->fd,"NOTICE "+std::string(user->nick)+" :The ban "+std::string(parameters[2])+" is already on the banlist of "+std::string(parameters[0]));
return;
@@ -91,11 +87,19 @@ class cmd_tban : public command_t
// use CallCommandHandler to make it so that the user sets the mode
// themselves
Srv->CallCommandHandler("MODE",setban,3,user);
- T.channel = channelname;
- T.mask = mask;
- T.expire = expire;
- TimedBanList.push_back(T);
- Srv->SendChannelServerNotice(Srv->GetServerName(),channel,"NOTICE "+std::string(channel->name)+" :"+std::string(user->nick)+" added a timed ban on "+mask+" lasting for "+std::string(duration)+" seconds.");
+ /* Check if the ban was actually added (e.g. banlist was NOT full) */
+ bool was_added = false;
+ for (BanList::iterator i = channel->bans.begin(); i != channel->bans.end(); i++)
+ if (!strcasecmp(i->data,mask.c_str()))
+ was_added = true;
+ if (was_added)
+ {
+ T.channel = channelname;
+ T.mask = mask;
+ T.expire = expire;
+ TimedBanList.push_back(T);
+ Srv->SendChannelServerNotice(Srv->GetServerName(),channel,"NOTICE "+std::string(channel->name)+" :"+std::string(user->nick)+" added a timed ban on "+mask+" lasting for "+std::string(duration)+" seconds.");
+ }
return;
}
else WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, channel->name);