]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Just use the standard fr_ipaddr_cmp function
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 10 Jun 2022 23:59:44 +0000 (18:59 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 12 Jun 2022 01:08:00 +0000 (20:08 -0500)
src/lib/util/inet.h
src/lib/util/value.c

index 65b1989eaa5b96f68dbfbd4d9696cbe73367ba2c..aed9dddff499e341994a2db7d3b8430c9cef4513 100644 (file)
@@ -63,10 +63,7 @@ typedef struct {
 typedef struct {
        int             af;                     //!< Address family.
        union {
-               struct {
-                       struct in_addr  v4;             //!< IPv4 address.
-                       uint8_t v4_padding[sizeof(struct in6_addr) - sizeof(struct in_addr)];
-               };
+               struct in_addr  v4;             //!< IPv4 address.
                struct in6_addr v6;             //!< IPv6 address.
        } addr;
        uint8_t         prefix;                 //!< Prefix length - Between 0-32 for IPv4 and 0-128 for IPv6.
index fd3c322e86d2d4159a159bc2bfc606f5d6edf62c..26f0c40536dc91e2df26c18fb16b19b711170ee7 100644 (file)
@@ -615,10 +615,8 @@ static inline void fr_value_box_copy_meta(fr_value_box_t *dst, fr_value_box_t co
  *     - 1 if a is more than b.
  *     - < -1 on failure.
  */
-int fr_value_box_cmp(fr_value_box_t const *a, fr_value_box_t const *b)
+int8_t fr_value_box_cmp(fr_value_box_t const *a, fr_value_box_t const *b)
 {
-       int compare = 0;
-
        if (!fr_cond_assert(a->type != FR_TYPE_NULL)) return -1;
        if (!fr_cond_assert(b->type != FR_TYPE_NULL)) return -1;
 
@@ -643,8 +641,8 @@ int fr_value_box_cmp(fr_value_box_t const *a, fr_value_box_t const *b)
                }
 
                if (length) {
-                       compare = memcmp(a->vb_octets, b->vb_octets, length);
-                       if (compare != 0) break;
+                       int cmp = memcmp(a->datum.ptr, b->datum.ptr, length);
+                       if (cmp != 0) return CMP(cmp, 0);
                }
 
                /*
@@ -653,116 +651,70 @@ int fr_value_box_cmp(fr_value_box_t const *a, fr_value_box_t const *b)
                 *
                 *      i.e. "0x00" is smaller than "0x0000"
                 */
-               compare = a->vb_length - b->vb_length;
+               return CMP(a->vb_length, b->vb_length);
        }
-               break;
 
-               /*
-                *      Short-hand for simplicity.
-                */
-#undef RETURN
+       /*
+        *      Short-hand for simplicity.
+        */
 #define RETURN(_type) return CMP(a->datum._type, b->datum._type)
-
-#undef COMPARE
-#define COMPARE(_type) compare = memcmp(&a->_type, &b->_type, sizeof(a->_type))
+#define COMPARE(_type) return CMP(memcmp(&a->datum._type, &b->datum._type, sizeof(a->datum._type)), 0);
 
        case FR_TYPE_BOOL:
                RETURN(boolean);
-               break;
 
        case FR_TYPE_DATE:
-               compare = fr_unix_time_cmp(a->datum.date, b->datum.date);
-               break;
+               return fr_unix_time_cmp(a->datum.date, b->datum.date);
 
        case FR_TYPE_UINT8:
                RETURN(uint8);
-               break;
 
        case FR_TYPE_UINT16:
                RETURN(uint16);
-               break;
 
        case FR_TYPE_UINT32:
                RETURN(uint32);
-               break;
 
        case FR_TYPE_UINT64:
                RETURN(uint64);
-               break;
 
        case FR_TYPE_INT8:
                RETURN(int8);
-               break;
 
        case FR_TYPE_INT16:
                RETURN(int16);
-               break;
 
        case FR_TYPE_INT32:
                RETURN(int32);
-               break;
 
        case FR_TYPE_INT64:
                RETURN(int64);
-               break;
 
        case FR_TYPE_SIZE:
                RETURN(size);
-               break;
 
        case FR_TYPE_TIME_DELTA:
-               compare = fr_time_delta_cmp(a->datum.time_delta, b->datum.time_delta);
-               break;
+               return fr_time_delta_cmp(a->datum.time_delta, b->datum.time_delta);
 
        case FR_TYPE_FLOAT32:
                RETURN(float32);
-               break;
 
        case FR_TYPE_FLOAT64:
                RETURN(float64);
-               break;
 
        case FR_TYPE_ETHERNET:
-               COMPARE(vb_ether);
-               break;
+               COMPARE(ether);
 
        case FR_TYPE_COMBO_IP_ADDR:
-               if (a->vb_ip.af == AF_INET) goto ipv4addr;
-               if (a->vb_ip.af == AF_INET6) goto ipv6addr;
-               return -2;
-
        case FR_TYPE_COMBO_IP_PREFIX:
-               if (a->vb_ip.af == AF_INET) goto ipv4prefix;
-               if (a->vb_ip.af == AF_INET6) goto ipv6prefix;
-               return -2;
-
        case FR_TYPE_IPV4_ADDR:
-       ipv4addr:
-               COMPARE(vb_ip.addr.v4.s_addr);
-               break;
-
        case FR_TYPE_IPV4_PREFIX:
-       ipv4prefix:
-               CMP_RETURN(a, b, vb_ip.prefix);
-               COMPARE(vb_ip.addr.v4.s_addr);
-               break;
-
        case FR_TYPE_IPV6_ADDR:
-       ipv6addr:
-               CMP_RETURN(a, b, vb_ip.scope_id);
-               COMPARE(vb_ip.addr.v6.s6_addr);
-               break;
-
        case FR_TYPE_IPV6_PREFIX:
-       ipv6prefix:
-               CMP_RETURN(a, b, vb_ip.prefix);
-               CMP_RETURN(a, b, vb_ip.scope_id);
-               COMPARE(vb_ip.addr.v6.s6_addr);
-               break;
+               return fr_ipaddr_cmp(&a->vb_ip, &b->vb_ip);
 
        case FR_TYPE_IFID:
-               COMPARE(vb_ifid);
-               break;
+               COMPARE(ifid);
 
        /*
         *      These should be handled at some point
@@ -776,9 +728,6 @@ int fr_value_box_cmp(fr_value_box_t const *a, fr_value_box_t const *b)
         *      static analysis will warn us they're not handled
         */
        }
-
-       if (compare > 0) return 1;
-       if (compare < 0) return -1;
        return 0;
 }