summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-07-16 13:52:10 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-07-16 13:52:10 +0000
commitd7875763890e79ddcc1f4f105d7b896b0d5e5d83 (patch)
tree0c6cab5e7d7918731a0e43b983c486bd3ed16807
parent5d18f26b6bfb7a575b50dc2e3ad909131b9f75da (diff)
Fix socket leak properly this time
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4405 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--include/dns.h2
-rw-r--r--include/dnsqueue.h1
-rw-r--r--src/dns.cpp4
-rw-r--r--src/dnsqueue.cpp37
-rw-r--r--src/userprocess.cpp3
-rw-r--r--src/users.cpp2
6 files changed, 45 insertions, 4 deletions
diff --git a/include/dns.h b/include/dns.h
index 9d293884a..ea02f03bb 100644
--- a/include/dns.h
+++ b/include/dns.h
@@ -216,6 +216,8 @@ void dns_deal_with_classes(int fd);
*/
bool dns_add_class(Resolver* r);
+void dns_close(int fd);
+
#ifdef THREADED_DNS
/** This is the handler function for multi-threaded DNS.
* It cannot be a class member as pthread will not let us
diff --git a/include/dnsqueue.h b/include/dnsqueue.h
index 2b3217847..9c192357c 100644
--- a/include/dnsqueue.h
+++ b/include/dnsqueue.h
@@ -3,3 +3,4 @@
bool lookup_dns(const std::string &nick);
void dns_poll(int fdcheck);
+void ZapThisDns(int fd);
diff --git a/src/dns.cpp b/src/dns.cpp
index e8b15c9bf..f2acf05a6 100644
--- a/src/dns.cpp
+++ b/src/dns.cpp
@@ -172,7 +172,6 @@ void dns_close(int fd)
if (fd == lastcreate)
{
wantclose = 1;
- return;
}
shutdown(fd,2);
close(fd);
@@ -800,6 +799,7 @@ std::string DNS::GetResult()
if (ServerInstance && ServerInstance->stats)
ServerInstance->stats->statsDnsGood++;
dns_close(this->myfd);
+ this->myfd = -1;
return result;
}
else
@@ -809,6 +809,7 @@ std::string DNS::GetResult()
if (this->myfd != -1)
{
dns_close(this->myfd);
+ this->myfd = -1;
}
return "";
}
@@ -822,6 +823,7 @@ std::string DNS::GetResultIP()
if (this->myfd != -1)
{
dns_close(this->myfd);
+ this->myfd = -1;
}
if (result)
{
diff --git a/src/dnsqueue.cpp b/src/dnsqueue.cpp
index ce0422fde..6d1ba0840 100644
--- a/src/dnsqueue.cpp
+++ b/src/dnsqueue.cpp
@@ -38,16 +38,18 @@ extern InspIRCd* ServerInstance;
class Lookup;
Lookup* dnslist[MAX_DESCRIPTORS];
+Lookup* user_fd_to_dns[MAX_DESCRIPTORS];
//enum LookupState { reverse, forward };
class Lookup {
private:
- DNS resolver1;
- DNS resolver2;
char u[NICKMAX];
std::string hostname;
public:
+ DNS resolver1;
+ DNS resolver2;
+
Lookup()
{
*u = 0;
@@ -81,6 +83,7 @@ public:
if (resolver1.GetFD() != -1)
{
dnslist[resolver1.GetFD()] = this;
+ user_fd_to_dns[usr->fd] = this;
return true;
}
}
@@ -148,7 +151,10 @@ public:
if ((usr) && (usr->dns_done))
{
if (resolver1.GetFD() != -1)
+ {
dnslist[resolver1.GetFD()] = NULL;
+ user_fd_to_dns[usr->fd] = NULL;
+ }
return true;
}
if (resolver1.GetFD() != -1)
@@ -157,6 +163,7 @@ public:
hostname = resolver1.GetResult();
if (usr)
{
+ user_fd_to_dns[usr->fd] = NULL;
if ((usr->registered > 3) || (hostname == ""))
{
WriteServ(usr->fd,"NOTICE Auth :*** Could not resolve your hostname -- Using your IP address instead");
@@ -168,7 +175,10 @@ public:
{
resolver2.ForwardLookup(hostname, true);
if (resolver2.GetFD() != -1)
+ {
dnslist[resolver2.GetFD()] = this;
+ user_fd_to_dns[usr->fd] = this;
+ }
}
}
}
@@ -225,6 +235,29 @@ bool lookup_dns(const std::string &nick)
return false;
}
+void ZapThisDns(int fd)
+{
+ if ((fd < 0) || (fd > MAX_DESCRIPTORS))
+ return;
+
+ Lookup *x = user_fd_to_dns[fd];
+
+ if (x)
+ {
+ if (x->resolver1.GetFD() != -1)
+ {
+ log(DEBUG,"Whacked resolver1");
+ dns_close(x->resolver1.GetFD());
+ }
+
+ if (x->resolver2.GetFD() != -1)
+ {
+ log(DEBUG,"Whacked resolver2");
+ dns_close(x->resolver2.GetFD());
+ }
+ }
+}
+
void dns_poll(int fdcheck)
{
/* Check the given file descriptor is in valid range */
diff --git a/src/userprocess.cpp b/src/userprocess.cpp
index b185bc4b5..a401efeb1 100644
--- a/src/userprocess.cpp
+++ b/src/userprocess.cpp
@@ -339,6 +339,7 @@ void DoBackgroundUserStuff(time_t TIME)
if (((unsigned)TIME > (unsigned)curr->timeout) && (curr->registered != 7))
{
log(DEBUG,"InspIRCd: registration timeout: %s",curr->nick);
+ ZapThisDns(curr->fd);
GlobalGoners.AddItem(curr,"Registration timeout");
continue;
}
@@ -350,6 +351,7 @@ void DoBackgroundUserStuff(time_t TIME)
if ((TIME > curr->signon) && (curr->registered == 3) && (AllModulesReportReady(curr)))
{
curr->dns_done = true;
+ ZapThisDns(curr->fd);
ServerInstance->stats->statsDnsBad++;
FullConnectUser(curr,&GlobalGoners);
continue;
@@ -359,6 +361,7 @@ void DoBackgroundUserStuff(time_t TIME)
{
log(DEBUG,"dns done, registered=3, and modules ready, OK");
FullConnectUser(curr,&GlobalGoners);
+ ZapThisDns(curr->fd);
continue;
}
diff --git a/src/users.cpp b/src/users.cpp
index 1e2e35321..61a5be70a 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -217,7 +217,7 @@ userrec::~userrec()
for (std::vector<ucrec*>::iterator n = chans.begin(); n != chans.end(); n++)
{
ucrec* x = (ucrec*)*n;
- DELETE(x);
+ delete x;
}
}