]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/coremods/core_dns.cpp
core_dns Allow usage of id 0
[user/henk/code/inspircd.git] / src / coremods / core_dns.cpp
index 47d5b3cab2062afa9a10e4a8e612164b8ceb1f1a..f4559c08fe672cca508bb43f9305aaf7e55ada39 100644 (file)
@@ -473,32 +473,34 @@ class MyManager : public Manager, public Timer, public EventHandler
 
                /* Create an id */
                unsigned int tries = 0;
+               int id;
                do
                {
-                       req->id = ServerInstance->GenRandomInt(DNS::MAX_REQUEST_ID);
+                       id = ServerInstance->GenRandomInt(DNS::MAX_REQUEST_ID);
 
                        if (++tries == DNS::MAX_REQUEST_ID*5)
                        {
                                // If we couldn't find an empty slot this many times, do a sequential scan as a last
                                // resort. If an empty slot is found that way, go on, otherwise throw an exception
-                               req->id = 0;
-                               for (int i = 1; i < DNS::MAX_REQUEST_ID; i++)
+                               id = -1;
+                               for (unsigned int i = 0; i < DNS::MAX_REQUEST_ID; i++)
                                {
                                        if (!this->requests[i])
                                        {
-                                               req->id = i;
+                                               id = i;
                                                break;
                                        }
                                }
 
-                               if (req->id == 0)
+                               if (id == -1)
                                        throw Exception("DNS: All ids are in use");
 
                                break;
                        }
                }
-               while (!req->id || this->requests[req->id]);
+               while (this->requests[id]);
 
+               req->id = id;
                this->requests[req->id] = req;
 
                Packet p;
@@ -555,14 +557,13 @@ class MyManager : public Manager, public Timer, public EventHandler
                }
        }
 
-       void HandleEvent(EventType et, int)
+       void OnEventHandlerError(int errcode) CXX11_OVERRIDE
        {
-               if (et == EVENT_ERROR)
-               {
-                       ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "UDP socket got an error event");
-                       return;
-               }
+               ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "UDP socket got an error event");
+       }
 
+       void OnEventHandlerRead() CXX11_OVERRIDE
+       {
                unsigned char buffer[524];
                irc::sockets::sockaddrs from;
                socklen_t x = sizeof(from);
@@ -572,6 +573,15 @@ class MyManager : public Manager, public Timer, public EventHandler
                if (length < Packet::HEADER_LENGTH)
                        return;
 
+               if (myserver != from)
+               {
+                       std::string server1 = from.str();
+                       std::string server2 = myserver.str();
+                       ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Got a result from the wrong server! Bad NAT or DNS forging attempt? '%s' != '%s'",
+                               server1.c_str(), server2.c_str());
+                       return;
+               }
+
                Packet recv_packet;
 
                try
@@ -584,15 +594,6 @@ class MyManager : public Manager, public Timer, public EventHandler
                        return;
                }
 
-               if (myserver != from)
-               {
-                       std::string server1 = from.str();
-                       std::string server2 = myserver.str();
-                       ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Got a result from the wrong server! Bad NAT or DNS forging attempt? '%s' != '%s'",
-                               server1.c_str(), server2.c_str());
-                       return;
-               }
-
                DNS::Request* request = this->requests[recv_packet.id];
                if (request == NULL)
                {