From 18310fc8b7dbb0dcda3f0fa10d2b37e2b1457c10 Mon Sep 17 00:00:00 2001 From: brain Date: Mon, 7 Apr 2008 16:18:32 +0000 Subject: We were lucky this one didnt bring down the whole devnet (see cmd_part.cpp diff) git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9400 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/commands/cmd_part.cpp | 2 +- src/socket.cpp | 39 ++++++++++++++++++++++----------------- 2 files changed, 23 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/commands/cmd_part.cpp b/src/commands/cmd_part.cpp index 002ae722b..360287c45 100644 --- a/src/commands/cmd_part.cpp +++ b/src/commands/cmd_part.cpp @@ -37,7 +37,7 @@ CmdResult CommandPart::Handle (const char* const* parameters, int pcnt, User *us } else { - reason = pcnt ? parameters[1] : ""; + reason = pcnt > 1 ? parameters[1] : ""; } if (ServerInstance->Parser->LoopCall(user, this, parameters, pcnt, 0)) diff --git a/src/socket.cpp b/src/socket.cpp index e48184694..fc48d219e 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -20,6 +20,12 @@ using namespace irc::sockets; +/* Private static member data must be initialized in this manner */ +unsigned int ListenSocket::socketcount = 0; +sockaddr* ListenSocket::sock_us = NULL; +sockaddr* ListenSocket::client = NULL; +sockaddr* ListenSocket::raddr = NULL; + /* Used when comparing CIDR masks for the modulus bits left over. * A lot of ircd's seem to do this: * ((-1) << (8 - (mask % 8))) @@ -51,6 +57,15 @@ ListenSocket::ListenSocket(InspIRCd* Instance, int port, char* addr) : ServerIns this->family = AF_INET; Instance->SE->AddFd(this); } + /* Saves needless allocations */ + if (socketcount == 0) + { + /* All instances of ListenSocket share these, so reference count it */ + sock_us = new sockaddr[2]; + client = new sockaddr[2]; + raddr = new sockaddr[2]; + } + socketcount++; } ListenSocket::~ListenSocket() @@ -63,26 +78,20 @@ ListenSocket::~ListenSocket() ServerInstance->Logs->Log("SOCKET", DEBUG,"Failed to cancel listener: %s", strerror(errno)); this->fd = -1; } + socketcount--; + if (socketcount == 0) + { + delete[] sock_us; + delete[] client; + delete[] raddr; + } } - -// XXX this is a bit of an untidy way to avoid reallocating this constantly. also, we leak it on shutdown.. but that's kinda minor - w -static sockaddr *sock_us; -static sockaddr *client; -static bool setup_sock = false; - void ListenSocket::HandleEvent(EventType, int) { socklen_t uslen, length; // length of our port number int incomingSockfd, in_port; - if (!setup_sock) - { - sock_us = new sockaddr[2]; - client = new sockaddr[2]; - setup_sock = true; - } - #ifdef IPV6 if (this->family == AF_INET6) { @@ -105,8 +114,6 @@ void ListenSocket::HandleEvent(EventType, int) *target = *buf = '\0'; - sockaddr* raddr = new sockaddr[2]; - #ifdef IPV6 if (this->family == AF_INET6) { @@ -131,8 +138,6 @@ void ListenSocket::HandleEvent(EventType, int) } - delete[] raddr; - ServerInstance->SE->NonBlocking(incomingSockfd); ServerInstance->stats->statsAccept++; -- cgit v1.2.3