diff options
author | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-08-05 19:12:21 +0000 |
---|---|---|
committer | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-08-05 19:12:21 +0000 |
commit | c819f500c5eb9ad907e5e9a71c525afd2ccaee0c (patch) | |
tree | d84f6cfaaaa2bb4c965d3d4f243369560a21133c /src/modules/m_spanningtree | |
parent | 02be48cfeb0125a16504e255dc93a99b44eb8ca3 (diff) |
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
Diffstat (limited to 'src/modules/m_spanningtree')
-rw-r--r-- | src/modules/m_spanningtree/ftopic.cpp | 34 |
1 files changed, 23 insertions, 11 deletions
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<std::string> & { 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<std::string> & 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); |