]> source.dussan.org Git - rspamd.git/commitdiff
Fix sorting order and unit test for upstreams.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 12 Mar 2015 19:08:42 +0000 (19:08 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 12 Mar 2015 19:08:42 +0000 (19:08 +0000)
src/libutil/addr.c
src/libutil/addr.h
src/libutil/upstream.c
src/main.c

index 19eda5a1318c8bebfe77e9ca98f275f0a1482b64..c2bb3db9c66213ea67fc6ffdd92eab4931d85d7d 100644 (file)
@@ -349,6 +349,12 @@ rspamd_parse_inet_address (rspamd_inet_addr_t **target, const char *src)
        if (src[0] == '/' || src[0] == '.') {
                return rspamd_parse_unix_path (target, src);
        }
+       else if (inet_pton (AF_INET, src, &su.s4.sin_addr) == 1) {
+               addr = rspamd_inet_addr_create (AF_INET);
+               memcpy (&addr->u.in.addr.s4.sin_addr, &su.s4.sin_addr,
+                               sizeof (struct in_addr));
+               ret = TRUE;
+       }
        else if (ipv6_status == RSPAMD_IPV6_SUPPORTED &&
                        inet_pton (AF_INET6, src, &su.s6.sin6_addr) == 1) {
                addr = rspamd_inet_addr_create (AF_INET6);
@@ -356,12 +362,6 @@ rspamd_parse_inet_address (rspamd_inet_addr_t **target, const char *src)
                                sizeof (struct in6_addr));
                ret = TRUE;
        }
-       else if (inet_pton (AF_INET, src, &su.s4.sin_addr) == 1) {
-               addr = rspamd_inet_addr_create (AF_INET6);
-               memcpy (&addr->u.in.addr.s4.sin_addr, &su.s4.sin_addr,
-                               sizeof (struct in_addr));
-               ret = TRUE;
-       }
 
        if (ret && target) {
                *target = addr;
@@ -918,8 +918,8 @@ rspamd_inet_address_compare (const rspamd_inet_addr_t *a1,
        g_assert (a2 != NULL);
 
        if (a1->af != a2->af) {
-               return (rspamd_inet_address_af_order (a1) -
-                               rspamd_inet_address_af_order (a2));
+               return (rspamd_inet_address_af_order (a2) -
+                               rspamd_inet_address_af_order (a1));
        }
        else {
                switch (a1->af) {
@@ -940,6 +940,15 @@ rspamd_inet_address_compare (const rspamd_inet_addr_t *a1,
        return 0;
 }
 
+gint
+rspamd_inet_address_compare_ptr (const gpointer a1,
+               const gpointer a2)
+{
+       const rspamd_inet_addr_t **i1 = a1, **i2 = a2;
+
+       return rspamd_inet_address_compare (*i1, *i2);
+}
+
 rspamd_inet_addr_t *
 rspamd_inet_address_copy (const rspamd_inet_addr_t *addr)
 {
index dd5b6adb6fad7c1bf9343732936f777215762394..1ea0ab8b5610dd37161b79dbc6c7aa91196ebfdc 100644 (file)
@@ -196,6 +196,14 @@ void rspamd_inet_address_apply_mask (rspamd_inet_addr_t *addr, guint mask);
 gint rspamd_inet_address_compare (const rspamd_inet_addr_t *a1,
                const rspamd_inet_addr_t *a2);
 
+/**
+ * Utility function to compare addresses by in g_ptr_array
+ * @param a1
+ * @param a2
+ * @return
+ */
+gint rspamd_inet_address_compare_ptr (const gpointer a1,
+               const gpointer a2);
 /**
  * Performs deep copy of rspamd inet addr
  * @param addr
index 6c962c35795400fdd4d21be18b8fa55516e3f902..6aa447042199faa46b8b84d60bce449c53ed9c89 100644 (file)
@@ -130,12 +130,12 @@ rspamd_upstream_af_to_weight (const rspamd_inet_addr_t *addr)
 static gint
 rspamd_upstream_addr_sort_func (gconstpointer a, gconstpointer b)
 {
-       const rspamd_inet_addr_t *ip1 = (const rspamd_inet_addr_t *)a,
-                       *ip2 = (const rspamd_inet_addr_t *)b;
+       const rspamd_inet_addr_t **ip1 = (const rspamd_inet_addr_t **)a,
+                       **ip2 = (const rspamd_inet_addr_t **)b;
        gint w1, w2;
 
-       w1 = rspamd_upstream_af_to_weight (ip1);
-       w2 = rspamd_upstream_af_to_weight (ip2);
+       w1 = rspamd_upstream_af_to_weight (*ip1);
+       w2 = rspamd_upstream_af_to_weight (*ip2);
 
        return w2 - w1;
 }
@@ -381,7 +381,6 @@ rspamd_upstream_dtor (struct upstream *up)
 
        rspamd_mutex_free (up->lock);
        g_free (up->name);
-       g_free (up->addrs.addr);
        g_slice_free1 (sizeof (*up), up);
 }
 
index 0864ab3952ef79edd5f1b44ae51d490bd57525ed..373c0169581aba7f17583fb5d173a75f6644cf89 100644 (file)
@@ -576,7 +576,7 @@ create_listen_socket (GPtrArray *addrs, guint cnt, gint listen_type)
        gint fd;
        guint i;
 
-       g_ptr_array_sort (addrs, (GCompareFunc)rspamd_inet_address_compare);
+       g_ptr_array_sort (addrs, rspamd_inet_address_compare_ptr);
        for (i = 0; i < cnt; i ++) {
                fd = rspamd_inet_address_listen (g_ptr_array_index (addrs, i),
                                listen_type, TRUE);