summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-09-07 23:15:05 +0000
committerw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-09-07 23:15:05 +0000
commit7a30c818ee4a5afb0aaea9adca4f2e3606b20c37 (patch)
tree8c6c770aa76258843e15dee44d9b7541c7e136dc /src
parent77b7c4300472ff1ba5c643b75ead4be75625f96f (diff)
Move a socket sanity check into the generic listener handler, avoiding the need to instantiate a user object in insane conditions.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10463 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r--src/listensocket.cpp19
-rw-r--r--src/usermanager.cpp16
2 files changed, 19 insertions, 16 deletions
diff --git a/src/listensocket.cpp b/src/listensocket.cpp
index 58934e543..7c679c1d3 100644
--- a/src/listensocket.cpp
+++ b/src/listensocket.cpp
@@ -127,6 +127,25 @@ void ListenSocket::AcceptInternal()
ServerInstance->Logs->Log("SOCKET", DEBUG, "Can't get peername: %s", strerror(errno));
}
+ /*
+ * XXX -
+ * this is done as a safety check to keep the file descriptors within range of fd_ref_table.
+ * its a pretty big but for the moment valid assumption:
+ * file descriptors are handed out starting at 0, and are recycled as theyre freed.
+ * therefore if there is ever an fd over 65535, 65536 clients must be connected to the
+ * irc server at once (or the irc server otherwise initiating this many connections, files etc)
+ * which for the time being is a physical impossibility (even the largest networks dont have more
+ * than about 10,000 users on ONE server!)
+ */
+ if (incomingSockfd >= ServerInstance->SE->GetMaxFds())
+ {
+ ServerInstance->Logs->Log("SOCKET", DEBUG, "Server is full");
+ ServerInstance->SE->Shutdown(incomingSockfd, 2);
+ ServerInstance->SE->Close(incomingSockfd);
+ ServerInstance->stats->statsRefused++;
+ return;
+ }
+
ServerInstance->SE->NonBlocking(incomingSockfd);
ServerInstance->stats->statsAccept++;
this->OnAcceptReady(target, incomingSockfd);
diff --git a/src/usermanager.cpp b/src/usermanager.cpp
index e5fdb7adc..1cb269bdf 100644
--- a/src/usermanager.cpp
+++ b/src/usermanager.cpp
@@ -112,22 +112,6 @@ void UserManager::AddUser(InspIRCd* Instance, int socket, int port, bool iscache
}
/*
- * XXX -
- * this is done as a safety check to keep the file descriptors within range of fd_ref_table.
- * its a pretty big but for the moment valid assumption:
- * file descriptors are handed out starting at 0, and are recycled as theyre freed.
- * therefore if there is ever an fd over 65535, 65536 clients must be connected to the
- * irc server at once (or the irc server otherwise initiating this many connections, files etc)
- * which for the time being is a physical impossibility (even the largest networks dont have more
- * than about 10,000 users on ONE server!)
- */
- if (socket >= Instance->SE->GetMaxFds())
- {
- this->QuitUser(New, "Server is full");
- return;
- }
-
- /*
* even with bancache, we still have to keep User::exempt current.
* besides that, if we get a positive bancache hit, we still won't fuck
* them over if they are exempt. -- w00t