diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-07-29 22:02:11 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-07-29 22:02:11 +0000 |
commit | ba1807932b9a22b58f3705d70b1b92b4cc959614 (patch) | |
tree | 48e71952370fba3d1b59ab749614f266df7583d4 | |
parent | c0449726a44c9772fe60d7994500c679c743c684 (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.cpp | 26 |
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); |