diff options
author | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-09-07 23:15:05 +0000 |
---|---|---|
committer | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-09-07 23:15:05 +0000 |
commit | 7a30c818ee4a5afb0aaea9adca4f2e3606b20c37 (patch) | |
tree | 8c6c770aa76258843e15dee44d9b7541c7e136dc /src | |
parent | 77b7c4300472ff1ba5c643b75ead4be75625f96f (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.cpp | 19 | ||||
-rw-r--r-- | src/usermanager.cpp | 16 |
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 |