diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-07-16 13:52:10 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-07-16 13:52:10 +0000 |
commit | d7875763890e79ddcc1f4f105d7b896b0d5e5d83 (patch) | |
tree | 0c6cab5e7d7918731a0e43b983c486bd3ed16807 | |
parent | 5d18f26b6bfb7a575b50dc2e3ad909131b9f75da (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.h | 2 | ||||
-rw-r--r-- | include/dnsqueue.h | 1 | ||||
-rw-r--r-- | src/dns.cpp | 4 | ||||
-rw-r--r-- | src/dnsqueue.cpp | 37 | ||||
-rw-r--r-- | src/userprocess.cpp | 3 | ||||
-rw-r--r-- | src/users.cpp | 2 |
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; } } |