From 639c67dbd85d566d04c87a2f6ec59fd9b5ffe54a Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 14 Jun 2017 09:30:08 +0100 Subject: [PATCH] [Fix] Fix parsing IPv6 nameservers in resolv.conf --- contrib/librdns/util.c | 8 +++++++ src/libserver/dns.c | 5 +++-- src/libutil/upstream.c | 44 ++++++++++++++++++++++++++++++++----- src/libutil/upstream.h | 10 +++++++-- src/plugins/surbl.c | 3 ++- test/rspamd_upstream_test.c | 4 +++- 6 files changed, 62 insertions(+), 12 deletions(-) diff --git a/contrib/librdns/util.c b/contrib/librdns/util.c index 9ea8f5c43..aa31c96b7 100644 --- a/contrib/librdns/util.c +++ b/contrib/librdns/util.c @@ -556,6 +556,7 @@ rdns_resolver_parse_resolv_conf_cb (struct rdns_resolver *resolver, { FILE *in; char buf[BUFSIZ]; + char *p; in = fopen (path, "r"); @@ -568,6 +569,13 @@ rdns_resolver_parse_resolv_conf_cb (struct rdns_resolver *resolver, break; } + /* Strip trailing spaces */ + p = buf + strlen (buf) - 1; + while (p > buf && + (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')) { + *p-- = '\0'; + } + if (!rdns_resolver_conf_process_line (resolver, buf, cb, ud)) { rdns_warn ("rdns_resolver_parse_resolv_conf: cannot parse line: %s", buf); fclose (in); diff --git a/src/libserver/dns.c b/src/libserver/dns.c index 21a15297c..d2629fd21 100644 --- a/src/libserver/dns.c +++ b/src/libserver/dns.c @@ -240,8 +240,9 @@ rspamd_dns_resolv_conf_on_server (struct rdns_resolver *resolver, { struct rspamd_dns_resolver *dns_resolver = ud; - return rspamd_upstreams_add_upstream (dns_resolver->ups, - name, port, NULL); + return rspamd_upstreams_add_upstream (dns_resolver->ups, name, port, + RSPAMD_UPSTREAM_PARSE_NAMESERVER, + NULL); } struct rspamd_dns_resolver * diff --git a/src/libutil/upstream.c b/src/libutil/upstream.c index 907024579..ac15780ad 100644 --- a/src/libutil/upstream.c +++ b/src/libutil/upstream.c @@ -563,20 +563,50 @@ rspamd_upstream_name (struct upstream *up) } gboolean -rspamd_upstreams_add_upstream (struct upstream_list *ups, - const gchar *str, guint16 def_port, void *data) +rspamd_upstreams_add_upstream (struct upstream_list *ups, const gchar *str, + guint16 def_port, enum rspamd_upstream_parse_type parse_type, + void *data) { struct upstream *up; GPtrArray *addrs = NULL; guint i; rspamd_inet_addr_t *addr; + gboolean ret = FALSE; up = g_slice_alloc0 (sizeof (*up)); - if (!rspamd_parse_host_port_priority (str, &addrs, - &up->weight, - &up->name, def_port, ups->ctx->pool)) { + switch (parse_type) { + case RSPAMD_UPSTREAM_PARSE_DEFAULT: + ret = rspamd_parse_host_port_priority (str, &addrs, + &up->weight, + &up->name, def_port, ups->ctx->pool); + break; + case RSPAMD_UPSTREAM_PARSE_NAMESERVER: + addrs = g_ptr_array_sized_new (1); + + ret = rspamd_parse_inet_address (&addr, str, strlen (str)); + + if (ret) { + if (rspamd_inet_address_get_port (addr) == 0) { + rspamd_inet_address_set_port (addr, def_port); + } + + g_ptr_array_add (addrs, addr); + rspamd_mempool_add_destructor (ups->ctx->pool, + (rspamd_mempool_destruct_t)rspamd_inet_address_free, + addr); + rspamd_mempool_add_destructor (ups->ctx->pool, + (rspamd_mempool_destruct_t)rspamd_ptr_array_free_hard, + addrs); + } + else { + g_ptr_array_free (addrs, TRUE); + } + + break; + } + if (!ret) { g_slice_free1 (sizeof (*up), up); return FALSE; } @@ -691,7 +721,9 @@ rspamd_upstreams_parse_line (struct upstream_list *ups, tmp = g_malloc (len + 1); rspamd_strlcpy (tmp, p, len + 1); - if (rspamd_upstreams_add_upstream (ups, tmp, def_port, data)) { + if (rspamd_upstreams_add_upstream (ups, tmp, def_port, + RSPAMD_UPSTREAM_PARSE_DEFAULT, + data)) { ret = TRUE; } diff --git a/src/libutil/upstream.h b/src/libutil/upstream.h index ddc480afe..84e75288d 100644 --- a/src/libutil/upstream.h +++ b/src/libutil/upstream.h @@ -110,6 +110,11 @@ gsize rspamd_upstreams_count (struct upstream_list *ups); */ gsize rspamd_upstreams_alive (struct upstream_list *ups); +enum rspamd_upstream_parse_type { + RSPAMD_UPSTREAM_PARSE_DEFAULT = 0, + RSPAMD_UPSTREAM_PARSE_NAMESERVER, +}; + /** * Add upstream from the string * @param ups upstream list @@ -118,8 +123,9 @@ gsize rspamd_upstreams_alive (struct upstream_list *ups); * @param data optional userdata * @return TRUE if upstream has been added */ -gboolean rspamd_upstreams_add_upstream (struct upstream_list *ups, - const gchar *str, guint16 def_port, void *data); +gboolean rspamd_upstreams_add_upstream (struct upstream_list *ups, const gchar *str, + guint16 def_port, enum rspamd_upstream_parse_type parse_type, + void *data); /** * Add multiple upstreams from comma, semicolon or space separated line diff --git a/src/plugins/surbl.c b/src/plugins/surbl.c index 78422461a..486b48388 100644 --- a/src/plugins/surbl.c +++ b/src/plugins/surbl.c @@ -768,7 +768,8 @@ surbl_module_config (struct rspamd_config *cfg) { redir_val = ucl_obj_tostring (cur); if (rspamd_upstreams_add_upstream (surbl_module_ctx->redirectors, - redir_val, 80, NULL)) { + redir_val, 80, RSPAMD_UPSTREAM_PARSE_DEFAULT, + NULL)) { surbl_module_ctx->use_redirector = TRUE; } } diff --git a/test/rspamd_upstream_test.c b/test/rspamd_upstream_test.c index 072a2a473..47094398f 100644 --- a/test/rspamd_upstream_test.c +++ b/test/rspamd_upstream_test.c @@ -78,7 +78,9 @@ rspamd_upstream_test_func (void) * Test v4/v6 priorities */ nls = rspamd_upstreams_create (cfg->ups_ctx); - g_assert (rspamd_upstreams_add_upstream (nls, "127.0.0.1", 0, NULL)); + g_assert (rspamd_upstreams_add_upstream (nls, "127.0.0.1", 0, + RSPAMD_UPSTREAM_PARSE_DEFAULT, + NULL)); up = rspamd_upstream_get (nls, RSPAMD_UPSTREAM_RANDOM, NULL, 0); rspamd_parse_inet_address (&paddr, "127.0.0.2", 0); g_assert (rspamd_upstream_add_addr (up, paddr)); -- 2.39.5