]> source.dussan.org Git - rspamd.git/commitdiff
Fix names for parsed addresses
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 24 Jan 2016 23:50:42 +0000 (23:50 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 24 Jan 2016 23:50:42 +0000 (23:50 +0000)
src/libserver/cfg_utils.c
src/libutil/addr.c
src/libutil/upstream.c

index 475850f958fbeb3a8266bc47e89b945d0ebc1a87..b6b44036ecdd051c26c8781670f90c4d6e321c47 100644 (file)
@@ -76,10 +76,10 @@ rspamd_parse_bind_line (struct rspamd_config *cfg,
 
        cnf->cnt = 1024;
 
-       if (strcmp (str, "systemd") == 0) {
+       if (g_ascii_strncasecmp (str, "systemd:", sizeof ("systemd:") - 1) == 0) {
                /* The actual socket will be passed by systemd environment */
                cnf->is_systemd = TRUE;
-               cnf->cnt = strtoul (str, &err, 10);
+               cnf->cnt = strtoul (str + sizeof ("systemd:") - 1, &err, 10);
                cnf->addrs = NULL;
 
                if (err == NULL || *err == '\0') {
index 85568f7c838ebd00951e1c9fb63337d93be3fe19..d6b73d603d0bf236871ccaa30e262fe134291f0d 100644 (file)
@@ -933,14 +933,18 @@ rspamd_resolve_addrs (const char *begin, size_t len, GPtrArray **addrs,
        struct addrinfo hints, *res, *cur;
        rspamd_inet_addr_t *cur_addr = NULL;
        gint r, addr_cnt;
-       gchar *addr_cpy;
+       gchar *addr_cpy = NULL;
 
        rspamd_ip_check_ipv6 ();
        memset (&hints, 0, sizeof (hints));
        hints.ai_socktype = SOCK_STREAM; /* Type of the socket */
        hints.ai_flags = AI_NUMERICSERV|flags;
-       addr_cpy = g_malloc (len + 1);
-       rspamd_strlcpy (addr_cpy, begin, len + 1);
+
+       if (len > 0) {
+               addr_cpy = g_malloc (len + 1);
+               rspamd_strlcpy (addr_cpy, begin, len + 1);
+       }
+       /* Otherwise it will be NULL */
 
        if (ipv6_status == RSPAMD_IPV6_SUPPORTED) {
                hints.ai_family = AF_UNSPEC;
@@ -981,7 +985,7 @@ rspamd_resolve_addrs (const char *begin, size_t len, GPtrArray **addrs,
 
                freeaddrinfo (res);
        }
-       else {
+       else if (addr_cpy) {
                msg_err_pool_check ("address resolution for %s failed: %s",
                                addr_cpy,
                                gai_strerror (r));
@@ -989,6 +993,10 @@ rspamd_resolve_addrs (const char *begin, size_t len, GPtrArray **addrs,
 
                return FALSE;
        }
+       else {
+               /* Should never ever happen */
+               g_assert (0);
+       }
 
        return TRUE;
 }
@@ -997,12 +1005,13 @@ gboolean
 rspamd_parse_host_port_priority (const gchar *str,
        GPtrArray **addrs,
        guint *priority,
-       gchar **name,
+       gchar **name_ptr,
        guint default_port,
        rspamd_mempool_t *pool)
 {
        gchar portbuf[8];
-       const gchar *p;
+       const gchar *p, *name = NULL;
+       gsize namelen;
        rspamd_inet_addr_t *cur_addr = NULL;
 
        /*
@@ -1019,9 +1028,12 @@ rspamd_parse_host_port_priority (const gchar *str,
                        return FALSE;
                }
 
-               if (!rspamd_resolve_addrs (str, 1, addrs, portbuf, AI_PASSIVE, pool)) {
+               if (!rspamd_resolve_addrs (str, 0, addrs, portbuf, AI_PASSIVE, pool)) {
                        return FALSE;
                }
+
+               name = "*";
+               namelen = 1;
        }
        else if (str[0] == '[') {
                /* This is braced IPv6 address */
@@ -1035,12 +1047,15 @@ rspamd_parse_host_port_priority (const gchar *str,
                        return FALSE;
                }
 
+               name = p + 1;
+               namelen = p - str - 1;
+
                if (!rspamd_check_port_priority (p + 1, default_port, priority, portbuf,
                                sizeof (portbuf), pool)) {
                        return FALSE;
                }
 
-               if (!rspamd_resolve_addrs (str + 1, p - str, addrs,
+               if (!rspamd_resolve_addrs (name, namelen, addrs,
                                portbuf, 0, pool)) {
                        return FALSE;
                }
@@ -1066,33 +1081,51 @@ rspamd_parse_host_port_priority (const gchar *str,
                }
 
                g_ptr_array_add (*addrs, cur_addr);
+               name = str;
+               namelen = strlen (str);
        }
        else {
                p = strchr (str, ':');
 
                if (p == NULL) {
                        /* Just address or IP */
+                       name = str;
+                       namelen = strlen (str);
                        rspamd_check_port_priority ("", default_port, priority, portbuf,
                                        sizeof (portbuf), pool);
 
-                       if (!rspamd_resolve_addrs (str, strlen (str), addrs,
+                       if (!rspamd_resolve_addrs (name, namelen, addrs,
                                        portbuf, 0, pool)) {
                                return FALSE;
                        }
                }
                else {
+                       name = str;
+                       namelen = p - str;
+
                        if (!rspamd_check_port_priority (p + 1, default_port, priority, portbuf,
                                        sizeof (portbuf), pool)) {
                                return FALSE;
                        }
 
-                       if (!rspamd_resolve_addrs (str + 1, p - str, addrs,
+                       if (!rspamd_resolve_addrs (str, p - str, addrs,
                                        portbuf, 0, pool)) {
                                return FALSE;
                        }
                }
        }
 
+       if (name_ptr != NULL) {
+               if (pool) {
+                       *name_ptr = rspamd_mempool_alloc (pool, namelen + 1);
+               }
+               else {
+                       *name_ptr = g_malloc (namelen + 1);
+               }
+
+               rspamd_strlcpy (*name_ptr, name, namelen + 1);
+       }
+
        return TRUE;
 }
 
index 9044d0633e1a9334ffd8ddc792ac870dfe55704e..1b863d53687fac7b1f389c683ba0d435a590105b 100644 (file)
@@ -527,7 +527,7 @@ rspamd_upstreams_add_upstream (struct upstream_list *ups,
                const gchar *str, guint16 def_port, void *data)
 {
        struct upstream *up;
-       GPtrArray *addrs;
+       GPtrArray *addrs = NULL;
        guint i;
        rspamd_inet_addr_t *addr;