]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
lib/socket: rearrange iface_comp() to use NUMERIC_CMP
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Mon, 8 Apr 2024 05:06:57 +0000 (17:06 +1200)
committerJule Anger <janger@samba.org>
Mon, 10 Jun 2024 13:25:17 +0000 (13:25 +0000)
We rearrange rather than just replacing the subtraction, because that
would call ntohl() more than necessary, and I think the flow is a bit
clearer this way.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15625

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
(cherry picked from commit 7ba6fcb93656e5e88e1d5bcd6002747aa64f0a3a)

lib/socket/interfaces.c

index d8724e6c669960ae7de0e86986180543816f42be..76a6570696ca623ae1956fff996fd3458e9ace01 100644 (file)
@@ -386,18 +386,18 @@ static int iface_comp(struct iface_struct *i1, struct iface_struct *i2)
        if (((struct sockaddr *)&i1->ip)->sa_family == AF_INET) {
                struct sockaddr_in *s1 = (struct sockaddr_in *)&i1->ip;
                struct sockaddr_in *s2 = (struct sockaddr_in *)&i2->ip;
-
-               r = ntohl(s1->sin_addr.s_addr) -
-                       ntohl(s2->sin_addr.s_addr);
-               if (r) {
-                       return r;
+               uint32_t a1 = ntohl(s1->sin_addr.s_addr);
+               uint32_t a2 = ntohl(s2->sin_addr.s_addr);
+               r = NUMERIC_CMP(a1, a2);
+               if (r == 0) {
+                       /* compare netmasks as a tiebreaker */
+                       s1 = (struct sockaddr_in *)&i1->netmask;
+                       s2 = (struct sockaddr_in *)&i2->netmask;
+                       a1 = ntohl(s1->sin_addr.s_addr);
+                       a2 = ntohl(s2->sin_addr.s_addr);
+                       r = NUMERIC_CMP(a1, a2);
                }
-
-               s1 = (struct sockaddr_in *)&i1->netmask;
-               s2 = (struct sockaddr_in *)&i2->netmask;
-
-               return ntohl(s1->sin_addr.s_addr) -
-                       ntohl(s2->sin_addr.s_addr);
+               return r;
        }
        return 0;
 }