]> granicus.if.org Git - pdns/commitdiff
Move from random() to dns_random()
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Thu, 14 Feb 2019 15:15:03 +0000 (16:15 +0100)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Thu, 14 Feb 2019 15:15:03 +0000 (16:15 +0100)
An alternative would be to make sure srandom() is always called.
But since dns_random() has the nice uniform upperbound API, I have
chosen to use that one.

pdns/lua-record.cc

index 429069e4e2d76baf993facfe6b3fcfcb9b00e4ef..ce9327d5348823858f9e4da59bf39cc9cb465d51 100644 (file)
@@ -7,6 +7,7 @@
 #include "ueberbackend.hh"
 #include <boost/format.hpp>
 #include "dnsrecords.hh"
+#include "dns_random.hh"
 
 #include "../modules/geoipbackend/geoipinterface.hh" // only for the enum
 
@@ -249,7 +250,7 @@ static ComboAddress pickrandom(const vector<ComboAddress>& ips)
   if (ips.empty()) {
     throw std::invalid_argument("The IP list cannot be empty");
   }
-  return ips[random() % ips.size()];
+  return ips[dns_random(ips.size())];
 }
 
 static ComboAddress hashed(const ComboAddress& who, const vector<ComboAddress>& ips)
@@ -273,7 +274,7 @@ static ComboAddress pickwrandom(const vector<pair<int,ComboAddress> >& wips)
     sum += i.first;
     pick.push_back({sum, i.second});
   }
-  int r = random() % sum;
+  int r = dns_random(sum);
   auto p = upper_bound(pick.begin(), pick.end(),r, [](int r, const decltype(pick)::value_type& a) { return  r < a.first;});
   return p->second;
 }
@@ -379,7 +380,7 @@ static ComboAddress pickclosest(const ComboAddress& bestwho, const vector<ComboA
     //          cout<<"    distance: "<<sqrt(dist2) * 40000.0/360<<" km"<<endl; // length of a degree
     ranked[dist2].push_back(c);
   }
-  return ranked.begin()->second[random() % ranked.begin()->second.size()];
+  return ranked.begin()->second[dns_random(ranked.begin()->second.size())];
 }
 
 static std::vector<DNSZoneRecord> lookup(const DNSName& name, uint16_t qtype, int zoneid)