0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-02 18:18:56 +02:00

modules/s_dns_resolver: Gracefully handle erroneous server list; error on entirely invalid list.

This commit is contained in:
Jason Volk 2019-03-11 11:52:42 -07:00
parent d474eed948
commit 6f6e090015
2 changed files with 55 additions and 13 deletions

View file

@ -150,7 +150,7 @@ ircd::net::dns::resolver::sendq_worker()
dock.wait([this]
{
assert(sendq.empty() || !tags.empty());
return !sendq.empty();
return !sendq.empty() && !server.empty();
});
if(tags.size() > size_t(send_burst))
@ -836,9 +836,23 @@ const
void
ircd::net::dns::resolver::set_servers()
try
{
const std::string &list(resolver::servers);
set_servers(list);
dock.notify_all();
}
catch(const std::exception &e)
{
log::error
{
net::log, "Erroneous configuration; falling back to defaults :%s",
e.what()
};
resolver::servers.fault();
if(!ircd::net::dns::resolver)
set_servers();
}
void
@ -847,20 +861,47 @@ ircd::net::dns::resolver::set_servers(const string_view &list)
server.clear();
server_next = 0;
tokens(list, ';', [this]
(const hostport &hp)
(const string_view &hp)
{
const auto &port
{
net::port(hp) != canon_port? net::port(hp) : uint16_t(53)
};
const ipport ipp
{
host(hp), port
};
add_server(ipp);
add_server(hp);
});
if(!empty(list) && server.empty())
throw error
{
"Failed to set any valid DNS servers from a non-empty list."
};
}
void
ircd::net::dns::resolver::add_server(const string_view &str)
try
{
const hostport hp
{
str
};
const auto &port
{
net::port(hp) != canon_port? net::port(hp) : uint16_t(53)
};
const ipport ipp
{
host(hp), port
};
add_server(ipp);
}
catch(const std::exception &e)
{
log::error
{
net::log, "Failed to add server '%s' :%s",
str,
e.what()
};
}
void

View file

@ -30,6 +30,7 @@ struct ircd::net::dns::resolver
unique_buffer<mutable_buffer> reply; // Buffer for recv
void add_server(const ipport &);
void add_server(const string_view &);
void set_servers(const string_view &list);
void set_servers();