]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Fix socket leak properly this time
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sun, 16 Jul 2006 13:52:10 +0000 (13:52 +0000)
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>
Sun, 16 Jul 2006 13:52:10 +0000 (13:52 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4405 e03df62e-2008-0410-955e-edbf42e46eb7

include/dns.h
include/dnsqueue.h
src/dns.cpp
src/dnsqueue.cpp
src/userprocess.cpp
src/users.cpp

index 9d293884acdc5d6f9164b6668127720e678dd17e..ea02f03bb46ff83d906267b0f46e4bf20372c4b2 100644 (file)
@@ -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
index 2b3217847226f4b564dc84ce43118f84f4bf23bc..9c192357cad33e2b684e38e27d02f4db07f32186 100644 (file)
@@ -3,3 +3,4 @@
 
 bool lookup_dns(const std::string &nick);
 void dns_poll(int fdcheck);
+void ZapThisDns(int fd);
index e8b15c9bf04092a0ca507c637bb29e168f395fa4..f2acf05a63eb3c91939081c9a73c65698f8ecd0f 100644 (file)
@@ -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)
        {
index ce0422fde4a6c707be4a3edb6925e0207966e1e0..6d1ba084079e6ba830ffe36fc40572047dfc8d01 100644 (file)
@@ -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 */
index b185bc4b5d033b6ff670f4c2dd360530fac56c85..a401efeb113682674f1fac0934336458d011de32 100644 (file)
@@ -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;
                        }
 
index 1e2e3532144d1bd6c5f820041312864651ed8bc1..61a5be70a613c5bae76b8ad90c61fb0e7393ca66 100644 (file)
@@ -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;
        }
 }