]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/treesocket1.cpp
Merge pull request #708 from SaberUK/master+development-branch
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / treesocket1.cpp
index 9376a551406142e977d9a19e5dc2847029285ee9..3c838177d11ceb4c0ba68740c8337c3a4e482a9a 100644 (file)
@@ -179,10 +179,10 @@ void TreeSocket::Squit(TreeServer* Current, const std::string &reason)
                        LocalSquit = true;
                        if (Current->GetSocket()->Introduced())
                        {
-                               parameterlist params;
+                               CmdBuilder params("SQUIT");
                                params.push_back(Current->GetID());
-                               params.push_back(":"+reason);
-                               Utils->DoOneToMany(Utils->TreeRoot->GetID(), "SQUIT", params);
+                               params.push_last(reason);
+                               params.Broadcast();
                        }
                }
                else
@@ -218,7 +218,13 @@ CmdResult CommandSQuit::HandleServer(TreeServer* server, std::vector<std::string
 
        TreeSocket* sock = server->GetSocket();
        sock->Squit(quitting, params[1]);
-       return CMD_SUCCESS;
+
+       // XXX: Return CMD_FAILURE when servers SQUIT themselves (i.e. :00S SQUIT 00S :Shutting down)
+       // to avoid RouteCommand() being called. RouteCommand() requires a valid command source but we
+       // do not have one because the server user is deleted when its TreeServer is destructed.
+       // We generate a SQUIT in TreeSocket::Squit(), with our sid as the source and send it to the
+       // remaining servers.
+       return ((quitting == server) ? CMD_FAILURE : CMD_SUCCESS);
 }
 
 /** This function is called when we receive data from a remote