]> granicus.if.org Git - pdns/commitdiff
clean up getQueryLocal() port handling htons
authorBert Hubert <bert.hubert@netherlabs.nl>
Thu, 17 Dec 2009 15:46:17 +0000 (15:46 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Thu, 17 Dec 2009 15:46:17 +0000 (15:46 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1454 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/lwres.cc
pdns/pdns_recursor.cc
pdns/syncres.hh

index f91c8f8cb6771bb605a42deef481e50e230366fe..13c09b4c06fe721b0fecb1ba9220310df16e2419 100644 (file)
@@ -112,7 +112,7 @@ int asyncresolve(const ComboAddress& ip, const string& domain, int type, bool do
       Socket s((AddressFamily)ip.sin4.sin_family, Stream);
 
       s.setNonBlocking();
-      ComboAddress local = getQueryLocalAddress(ip.sin4.sin_family);
+      ComboAddress local = getQueryLocalAddress(ip.sin4.sin_family, 0);
 
       s.bind(local);
        
index 99e6b4f4706f64dd7e4e8fbd2d17d72bc79d03dd..a2ecfb53b2ca39586f66a3bcffb36fb52b8b1fc6 100644 (file)
@@ -182,19 +182,26 @@ int arecvtcp(string& data, int len, Socket* sock)
 
 vector<ComboAddress> g_localQueryAddresses4, g_localQueryAddresses6; 
 ComboAddress g_local4("0.0.0.0"), g_local6("::");
-ComboAddress getQueryLocalAddress(int family)
+
+ComboAddress getQueryLocalAddress(int family, uint16_t port)
 {
+  ComboAddress ret;
   if(family==AF_INET) {
-    if(g_localQueryAddresses4.empty())
-      return g_local4;
-    return g_localQueryAddresses4[dns_random(g_localQueryAddresses4.size())];
+    if(g_localQueryAddresses4.empty()) 
+      ret = g_local4;
+    else 
+      ret = g_localQueryAddresses4[dns_random(g_localQueryAddresses4.size())];
+    ret.sin4.sin_port = htons(port);
   }
   else {
     if(g_localQueryAddresses6.empty())
-      return g_local6;
-    return g_localQueryAddresses6[dns_random(g_localQueryAddresses6.size())];
+      ret = g_local6;
+    else
+      ret = g_localQueryAddresses6[dns_random(g_localQueryAddresses6.size())];
+      
+    ret.sin6.sin6_port = htons(port);
   }
-
+  return ret;
 }
 
 void handleUDPServerResponse(int fd, FDMultiplexer::funcparam_t&);
@@ -280,11 +287,15 @@ public:
     
     int tries=10;
     while(--tries) {
-      uint16_t port=1025+dns_random(64510);
+      uint16_t port;
+      
       if(tries==1)  // fall back to kernel 'random'
-       port=0;
+       port = 0;
+      else
+        port = 1025 + dns_random(64510);
+      
+      ComboAddress sin=getQueryLocalAddress(family, port); // does htons for us
 
-      ComboAddress sin=getQueryLocalAddress(family);
       if (::bind(ret, (struct sockaddr *)&sin, sin.getSocklen()) >= 0) 
        break;
     }
index db32dd58681eced8f7961302dac58d302bc42358..90d9e1be7dc3501bd804e841b7244e7d7fdb837d 100644 (file)
@@ -563,5 +563,5 @@ replacing_insert(Index& i,const typename Index::value_type& x)
 
 std::string reloadAuthAndForwards();
 ComboAddress parseIPAndPort(const std::string& input, uint16_t port);
-ComboAddress getQueryLocalAddress(int family);
+ComboAddress getQueryLocalAddress(int family, uint16_t port);
 #endif