summaryrefslogtreecommitdiff
path: root/src/modules/m_spanningtree
diff options
context:
space:
mode:
authorw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-08-05 19:12:21 +0000
committerw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-08-05 19:12:21 +0000
commitc819f500c5eb9ad907e5e9a71c525afd2ccaee0c (patch)
treed84f6cfaaaa2bb4c965d3d4f243369560a21133c /src/modules/m_spanningtree
parent02be48cfeb0125a16504e255dc93a99b44eb8ca3 (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.cpp34
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);