aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2018-11-01 22:17:34 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2018-11-01 22:53:48 +0000
commit71eb32a976512b294e077861a3123842e20611b6 (patch)
tree1feb0b69e8ff940c12335520bff54c1adee13c93
parentMerge pull request #4721 (diff)
downloadmonero-71eb32a976512b294e077861a3123842e20611b6.tar.xz
dns_utils: do not exit if DNS records are corrupt
-rw-r--r--src/common/dns_utils.cpp41
-rw-r--r--src/common/dns_utils.h3
2 files changed, 36 insertions, 8 deletions
diff --git a/src/common/dns_utils.cpp b/src/common/dns_utils.cpp
index f2b270981..606a2c7b7 100644
--- a/src/common/dns_utils.cpp
+++ b/src/common/dns_utils.cpp
@@ -37,6 +37,7 @@
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
#include <boost/algorithm/string/join.hpp>
+#include <boost/optional.hpp>
using namespace epee;
namespace bf = boost::filesystem;
@@ -119,10 +120,25 @@ get_builtin_ds(void)
namespace tools
{
+static const char *get_record_name(int record_type)
+{
+ switch (record_type)
+ {
+ case DNS_TYPE_A: return "A";
+ case DNS_TYPE_TXT: return "TXT";
+ case DNS_TYPE_AAAA: return "AAAA";
+ default: return "unknown";
+ }
+}
+
// fuck it, I'm tired of dealing with getnameinfo()/inet_ntop/etc
-std::string ipv4_to_string(const char* src, size_t len)
+boost::optional<std::string> ipv4_to_string(const char* src, size_t len)
{
- assert(len >= 4);
+ if (len < 4)
+ {
+ MERROR("Invalid IPv4 address: " << std::string(src, len));
+ return boost::none;
+ }
std::stringstream ss;
unsigned int bytes[4];
@@ -140,9 +156,13 @@ std::string ipv4_to_string(const char* src, size_t len)
// this obviously will need to change, but is here to reflect the above
// stop-gap measure and to make the tests pass at least...
-std::string ipv6_to_string(const char* src, size_t len)
+boost::optional<std::string> ipv6_to_string(const char* src, size_t len)
{
- assert(len >= 8);
+ if (len < 8)
+ {
+ MERROR("Invalid IPv4 address: " << std::string(src, len));
+ return boost::none;
+ }
std::stringstream ss;
unsigned int bytes[8];
@@ -162,8 +182,10 @@ std::string ipv6_to_string(const char* src, size_t len)
return ss.str();
}
-std::string txt_to_string(const char* src, size_t len)
+boost::optional<std::string> txt_to_string(const char* src, size_t len)
{
+ if (len == 0)
+ return boost::none;
return std::string(src+1, len-1);
}
@@ -266,7 +288,7 @@ DNSResolver::~DNSResolver()
}
}
-std::vector<std::string> DNSResolver::get_record(const std::string& url, int record_type, std::string (*reader)(const char *,size_t), bool& dnssec_available, bool& dnssec_valid)
+std::vector<std::string> DNSResolver::get_record(const std::string& url, int record_type, boost::optional<std::string> (*reader)(const char *,size_t), bool& dnssec_available, bool& dnssec_valid)
{
std::vector<std::string> addresses;
dnssec_available = false;
@@ -289,7 +311,12 @@ std::vector<std::string> DNSResolver::get_record(const std::string& url, int rec
{
for (size_t i=0; result->data[i] != NULL; i++)
{
- addresses.push_back((*reader)(result->data[i], result->len[i]));
+ boost::optional<std::string> res = (*reader)(result->data[i], result->len[i]);
+ if (res)
+ {
+ MINFO("Found \"" << *res << "\" in " << get_record_name(record_type) << " record for " << url);
+ addresses.push_back(*res);
+ }
}
}
}
diff --git a/src/common/dns_utils.h b/src/common/dns_utils.h
index f46bca3dd..3a6ef68a1 100644
--- a/src/common/dns_utils.h
+++ b/src/common/dns_utils.h
@@ -30,6 +30,7 @@
#include <vector>
#include <string>
#include <functional>
+#include <boost/optional/optional_fwd.hpp>
namespace tools
{
@@ -143,7 +144,7 @@ private:
* @return A vector of strings containing the requested record; or an empty vector
*/
// TODO: modify this to accommodate DNSSEC
- std::vector<std::string> get_record(const std::string& url, int record_type, std::string (*reader)(const char *,size_t), bool& dnssec_available, bool& dnssec_valid);
+ std::vector<std::string> get_record(const std::string& url, int record_type, boost::optional<std::string> (*reader)(const char *,size_t), bool& dnssec_available, bool& dnssec_valid);
/**
* @brief Checks a string to see if it looks like a URL