From 7a30c818ee4a5afb0aaea9adca4f2e3606b20c37 Mon Sep 17 00:00:00 2001 From: w00t Date: Sun, 7 Sep 2008 23:15:05 +0000 Subject: 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 --- src/listensocket.cpp | 19 +++++++++++++++++++ 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 @@ -111,22 +111,6 @@ void UserManager::AddUser(InspIRCd* Instance, int socket, int port, bool iscache return; } - /* - * 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 -- cgit v1.2.3