s4:kdc: Implement KDC plugin hardware authentication policy
[samba.git] / lib / socket / interfaces.c
index 4908b0f55e240f5d136d4e5e19767c04150a6f1c..2426ce2b52a3d3fd75b89d4296a0c5c2284e86dd 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;
 }