subtraction of two void * is not well defined, plus two void * can be apart
authorotto <otto@openbsd.org>
Thu, 25 Dec 2014 20:13:14 +0000 (20:13 +0000)
committerotto <otto@openbsd.org>
Thu, 25 Dec 2014 20:13:14 +0000 (20:13 +0000)
more than an int can hold; ok krw@ deraadt@ and tedu@ (by implication)

usr.sbin/nsd/xfrd-tcp.c

index a317857..3fec5d3 100644 (file)
@@ -30,6 +30,8 @@ xfrd_pipe_cmp(const void* a, const void* b)
        const struct xfrd_tcp_pipeline* x = (struct xfrd_tcp_pipeline*)a;
        const struct xfrd_tcp_pipeline* y = (struct xfrd_tcp_pipeline*)b;
        int r;
+       if(x == y)
+               return 0;
        if(y->ip_len != x->ip_len)
                return (int)y->ip_len - (int)x->ip_len;
        r = memcmp(&x->ip, &y->ip, x->ip_len);
@@ -40,7 +42,7 @@ xfrd_pipe_cmp(const void* a, const void* b)
        if(x->num_unused != y->num_unused)
                return x->num_unused - y->num_unused;
        /* different pipelines are different still, even with same numunused*/
-       return (int)(a - b);
+       return (uintptr_t)x < (uintptr_t)y ? -1 : 1;
 }
 
 xfrd_tcp_set_t* xfrd_tcp_set_create(struct region* region)