From c819f500c5eb9ad907e5e9a71c525afd2ccaee0c Mon Sep 17 00:00:00 2001 From: w00t Date: Tue, 5 Aug 2008 19:12:21 +0000 Subject: Forward-port r10098 and r10099, fixing anope+inspircd=ftopic ddos. Thanks to Namegduf for all his help. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10100 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/m_spanningtree/ftopic.cpp | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/modules/m_spanningtree/ftopic.cpp b/src/modules/m_spanningtree/ftopic.cpp index e18187087..663baa089 100644 --- a/src/modules/m_spanningtree/ftopic.cpp +++ b/src/modules/m_spanningtree/ftopic.cpp @@ -33,17 +33,12 @@ bool TreeSocket::ForceTopic(const std::string &source, std::deque & { if ((ts >= c->topicset) || (c->topic.empty())) { - std::string oldtopic = c->topic; - c->topic.assign(params[3], 0, Instance->Config->Limits.MaxTopic); - c->setby.assign(params[2], 0, 127); - c->topicset = ts; - /* if the topic text is the same as the current topic, - * dont bother to send the TOPIC command out, just silently - * update the set time and set nick. - */ - if (oldtopic != params[3]) + User* user = this->Instance->FindNick(source); + + if (c->topic != params[3]) { - User* user = this->Instance->FindNick(source); + // Update topic only when it differs from current topic + c->topic.assign(params[3], 0, Instance->Config->Limits.MaxTopic); if (!user) { c->WriteChannelWithServ(Instance->Config->ServerName, "TOPIC %s :%s", c->name.c_str(), c->topic.c_str()); @@ -51,10 +46,27 @@ bool TreeSocket::ForceTopic(const std::string &source, std::deque & else { c->WriteChannel(user, "TOPIC %s :%s", c->name.c_str(), c->topic.c_str()); - nsource = user->server; } } + // Always update setter and settime. + c->setby.assign(params[2], 0, 127); + c->topicset = ts; + + /* + * Take careful note of what happens here; + * Above, we display the topic change to the server IF the topic incoming is different to the topic already set. + * HERE, we find the server the user that sent this topic is on, so we *do not* send topics back to the link they just + * came from. This *cannot* be easily merged with the above check! + * + * Thanks to Anope and Namegduf for finally helping me isolate this + * -- w00t (5th/aug/2008) + */ + if (user) + { + nsource = user->server; + } + /* all done, send it on its way */ params[3] = ":" + params[3]; User* u = Instance->FindNick(nsource); -- cgit v1.2.3