summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-08-27 22:32:40 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-08-27 22:32:40 +0000
commit1211f840f16bacb21425eedba6794dfc8b39da40 (patch)
tree7b85b3ad18d152747c9c1de8425036e5cf6a3818
parentf8e460b127b3d8f57e42276016dc94dd5d4ecf82 (diff)
Fix potential for duplicate SID if the SID is auto generated.
Auto generated SIDs are initialized too late after modules are loaded rather than before. Fixed. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7924 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--src/inspircd.cpp68
-rw-r--r--src/modules/m_spanningtree/treesocket2.cpp13
-rw-r--r--src/modules/m_spanningtree/utils.cpp3
3 files changed, 48 insertions, 36 deletions
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index 1618266c0..bc968e87e 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -6,7 +6,7 @@
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
- * the file COPYING for details.
+ * the file COPYING for details.
*
* ---------------------------------------------------
*/
@@ -309,7 +309,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
memset(&server, 0, sizeof(server));
memset(&client, 0, sizeof(client));
- SocketEngineFactory* SEF = new SocketEngineFactory();
+ SocketEngineFactory* SEF = new SocketEngineFactory();
SE = SEF->Create(this);
delete SEF;
@@ -432,6 +432,37 @@ InspIRCd::InspIRCd(int argc, char** argv)
Config->ClearStack();
Config->Read(true, NULL);
+ /*
+ * Initialise UID. XXX, we need to read SID from config, and use it instead of 000.
+ * For an explanation as to exactly how this works, and why it works this way, see GetUID().
+ * -- w00t
+ */
+ int i;
+
+ /* Generate SID */
+ size_t sid = 0;
+ if (Config->sid)
+ {
+ sid = Config->sid;
+ }
+ else
+ {
+ for (const char* x = Config->ServerName; *x; ++x)
+ sid = 5 * sid + *x;
+ for (const char* y = Config->ServerDesc; *y; ++y)
+ sid = 5 * sid + *y;
+ sid = sid % 999;
+
+ Config->sid = sid;
+ }
+ current_uid[0] = sid / 100 + 48;
+ current_uid[1] = ((sid / 10) % 10) + 48;
+ current_uid[2] = sid % 10 + 48;
+
+ /* Initialise UID */
+ for(i = 3; i < UUID_LENGTH - 1; i++)
+ current_uid[i] = 'A';
+
if (!do_root)
this->CheckRoot();
else
@@ -533,39 +564,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
}
#endif
-
- /*
- * Initialise UID. XXX, we need to read SID from config, and use it instead of 000.
- * For an explanation as to exactly how this works, and why it works this way, see GetUID().
- * -- w00t
- */
- int i;
-
-
- /* Generate SID */
- size_t sid = 0;
- if (Config->sid)
- {
- sid = Config->sid;
- }
- else
- {
- for (const char* x = Config->ServerName; *x; ++x)
- sid = 5 * sid + *x;
- for (const char* y = Config->ServerDesc; *y; ++y)
- sid = 5 * sid + *y;
- sid = sid % 999;
-
- Config->sid = sid;
- }
- current_uid[0] = sid / 100 + 48;
- current_uid[1] = ((sid / 10) % 10) + 48;
- current_uid[2] = sid % 10 + 48;
-
- /* Initialise UID */
- for(i = 3; i < UUID_LENGTH - 1; i++)
- current_uid[i] = 'A';
-
printf("\nInspIRCd is now running!\n");
Log(DEFAULT,"Startup complete.");
diff --git a/src/modules/m_spanningtree/treesocket2.cpp b/src/modules/m_spanningtree/treesocket2.cpp
index 4d62c3b83..34cf318e3 100644
--- a/src/modules/m_spanningtree/treesocket2.cpp
+++ b/src/modules/m_spanningtree/treesocket2.cpp
@@ -799,6 +799,7 @@ bool TreeSocket::RemoteServer(const std::string &prefix, std::deque<std::string>
this->Instance->SNO->WriteToSnoMask('l',"Server \2"+servername+"\2 being introduced from \2" + prefix + "\2 denied, already exists. Closing link with " + prefix);
return false;
}
+
Link* lnk = Utils->FindLink(servername);
TreeServer *Node = new TreeServer(this->Utils, this->Instance, servername, description, sid, ParentOfThis,NULL, lnk ? lnk->Hidden : false);
@@ -950,7 +951,17 @@ bool TreeSocket::Inbound_Server(std::deque<std::string> &params)
CheckDupeSocket->Close();
return false;
}
- /* Now check for fully initialized instances of the server */
+ /* Check for fully initialized instances of the server by id */
+ Instance->Log(DEBUG,"Looking for dupe SID %s", sid.c_str());
+ TreeServer* CheckDupeSID = Utils->FindServerID(sid);
+ if (CheckDupeSID)
+ {
+ this->SendError("Server ID "+CheckDupeSID->GetID()+" already exists on server "+CheckDupeSID->GetName()+"!");
+ this->Instance->SNO->WriteToSnoMask('l',"Server connection from \2"+sname+"\2 denied, server ID '"+CheckDupeSID->GetID()+
+ "' already exists on server "+CheckDupeSID->GetName());
+ return false;
+ }
+ /* Now check for fully initialized instances of the server by name */
TreeServer* CheckDupe = Utils->FindServer(sname);
if (CheckDupe)
{
diff --git a/src/modules/m_spanningtree/utils.cpp b/src/modules/m_spanningtree/utils.cpp
index 8610a1666..e38a959b7 100644
--- a/src/modules/m_spanningtree/utils.cpp
+++ b/src/modules/m_spanningtree/utils.cpp
@@ -151,6 +151,7 @@ TreeServer* SpanningTreeUtilities::FindServerMask(const std::string &ServerName)
TreeServer* SpanningTreeUtilities::FindServerID(const std::string &id)
{
+ ServerInstance->Log(DEBUG,"Looking for id: %s", id.c_str());
server_hash::iterator iter = sidlist.find(id);
if (iter != sidlist.end())
return iter->second;
@@ -176,6 +177,8 @@ SpanningTreeUtilities::SpanningTreeUtilities(InspIRCd* Instance, ModuleSpanningT
lines_to_apply = 0;
+ ServerInstance->Log(DEBUG, "SpanningTreeUtilities: SID: %s", OurSID.c_str());
+
this->TreeRoot = new TreeServer(this, ServerInstance, ServerInstance->Config->ServerName, ServerInstance->Config->ServerDesc, OurSID);
modulelist* ml = ServerInstance->FindInterface("InspSocketHook");