aboutsummaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-07-05 16:04:17 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-07-05 16:04:17 +0100
commita073be8fbc9479ff4a45a35b479547fe530858c4 (patch)
tree0ced5c61d2d55390bc900a8f18f3b3dfc026890b /src/libserver
parent6716825ffde68dae6969db1f7a30c2c9b105c678 (diff)
downloadrspamd-a073be8fbc9479ff4a45a35b479547fe530858c4.tar.gz
rspamd-a073be8fbc9479ff4a45a35b479547fe530858c4.zip
[Fix] Work with broken resolvers in resolv.conf
Diffstat (limited to 'src/libserver')
-rw-r--r--src/libserver/dns.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/libserver/dns.c b/src/libserver/dns.c
index b10eaf8c4..d75ad00e8 100644
--- a/src/libserver/dns.c
+++ b/src/libserver/dns.c
@@ -21,6 +21,7 @@
#include "utlist.h"
#include "uthash.h"
#include "rdns_event.h"
+#include "unix-std.h"
static struct rdns_upstream_elt* rspamd_dns_select_upstream (const char *name,
size_t len, void *ups_data);
@@ -240,6 +241,34 @@ rspamd_dns_resolv_conf_on_server (struct rdns_resolver *resolver,
int priority, unsigned int io_cnt, void *ud)
{
struct rspamd_dns_resolver *dns_resolver = ud;
+ struct rspamd_config *cfg;
+ rspamd_inet_addr_t *addr;
+ gint test_fd;
+
+ cfg = dns_resolver->cfg;
+
+ msg_info_config ("parsed nameserver %s from resolv.conf", name);
+
+ /* Try to open a connection */
+ if (!rspamd_parse_inet_address (&addr, name, strlen (name))) {
+ msg_warn_config ("cannot parse nameserver address %s", name);
+
+ return FALSE;
+ }
+
+ rspamd_inet_address_set_port (addr, port);
+ test_fd = rspamd_inet_address_connect (addr, SOCK_DGRAM, TRUE);
+
+ if (test_fd == -1) {
+ msg_warn_config ("cannot open connection to nameserver at address %s: %s",
+ name, strerror (errno));
+ rspamd_inet_address_free (addr);
+
+ return FALSE;
+ }
+
+ rspamd_inet_address_free (addr);
+ close (test_fd);
return rspamd_upstreams_add_upstream (dns_resolver->ups, name, port,
RSPAMD_UPSTREAM_PARSE_NAMESERVER,