]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add more casting for booleans
authorAlan T. DeKok <aland@freeradius.org>
Thu, 20 Jan 2022 13:53:06 +0000 (08:53 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 20 Jan 2022 13:53:06 +0000 (08:53 -0500)
src/lib/util/calc.c
src/tests/unit/xlat/purify.txt

index ea5a8084865ab5732dca57181371dc41babacdbf..9fab01ed1a866cf3543bb4daf00de2a9ababfe2d 100644 (file)
@@ -61,6 +61,8 @@ static const fr_type_t upcast_op[FR_TYPE_MAX + 1][FR_TYPE_MAX + 1] = {
         *      Prefix + int --> ipaddr
         */
        [FR_TYPE_IPV4_PREFIX] = {
+               [FR_TYPE_BOOL] =   FR_TYPE_IPV4_ADDR,
+
                [FR_TYPE_UINT8] =   FR_TYPE_IPV4_ADDR,
                [FR_TYPE_UINT16] =  FR_TYPE_IPV4_ADDR,
                [FR_TYPE_UINT32] =  FR_TYPE_IPV4_ADDR,
@@ -78,6 +80,8 @@ static const fr_type_t upcast_op[FR_TYPE_MAX + 1][FR_TYPE_MAX + 1] = {
        },
 
        [FR_TYPE_IPV6_PREFIX] = {
+               [FR_TYPE_BOOL] =   FR_TYPE_IPV6_ADDR,
+
                [FR_TYPE_UINT8] =   FR_TYPE_IPV6_ADDR,
                [FR_TYPE_UINT16] =  FR_TYPE_IPV6_ADDR,
                [FR_TYPE_UINT32] =  FR_TYPE_IPV6_ADDR,
@@ -94,6 +98,31 @@ static const fr_type_t upcast_op[FR_TYPE_MAX + 1][FR_TYPE_MAX + 1] = {
                [FR_TYPE_FLOAT64] = FR_TYPE_IPV6_ADDR,
        },
 
+       /*
+        *      Bools and to pretty much any numerical type result in
+        *      the other integer.
+        */
+       [FR_TYPE_BOOL] = {
+               [FR_TYPE_UINT8] = FR_TYPE_UINT8,
+               [FR_TYPE_UINT16] = FR_TYPE_UINT16,
+               [FR_TYPE_UINT32] = FR_TYPE_UINT32,
+               [FR_TYPE_UINT64] = FR_TYPE_UINT64,
+
+               [FR_TYPE_SIZE] =   FR_TYPE_SIZE,
+
+               [FR_TYPE_DATE]  = FR_TYPE_DATE,
+
+               [FR_TYPE_INT8]   = FR_TYPE_INT16,
+               [FR_TYPE_INT16]  = FR_TYPE_INT16,
+               [FR_TYPE_INT32]  = FR_TYPE_INT32,
+               [FR_TYPE_INT64]  = FR_TYPE_INT64,
+
+               [FR_TYPE_TIME_DELTA] = FR_TYPE_TIME_DELTA,
+
+               [FR_TYPE_FLOAT32] = FR_TYPE_FLOAT32,
+               [FR_TYPE_FLOAT64] = FR_TYPE_FLOAT64,
+       },
+
        /*
         *      Various ints get cast to the next highest size which
         *      can hold their values.
@@ -285,14 +314,39 @@ static const fr_type_t upcast_cmp[FR_TYPE_MAX + 1][FR_TYPE_MAX + 1] = {
                [FR_TYPE_OCTETS] = FR_TYPE_ETHERNET,
        },
 
+       /*
+        *      Bools compared to pretty much any numerical type
+        *      result in the other integer.
+        */
        [FR_TYPE_BOOL] = {
                [FR_TYPE_STRING] = FR_TYPE_BOOL,
                [FR_TYPE_OCTETS] = FR_TYPE_BOOL,
+
+               [FR_TYPE_UINT8] = FR_TYPE_UINT8,
+               [FR_TYPE_UINT16] = FR_TYPE_UINT16,
+               [FR_TYPE_UINT32] = FR_TYPE_UINT32,
+               [FR_TYPE_UINT64] = FR_TYPE_UINT64,
+
+               [FR_TYPE_SIZE] =   FR_TYPE_SIZE,
+
+               [FR_TYPE_DATE]  = FR_TYPE_DATE,
+
+               [FR_TYPE_INT8]   = FR_TYPE_INT16,
+               [FR_TYPE_INT16]  = FR_TYPE_INT16,
+               [FR_TYPE_INT32]  = FR_TYPE_INT32,
+               [FR_TYPE_INT64]  = FR_TYPE_INT64,
+
+               [FR_TYPE_TIME_DELTA] = FR_TYPE_TIME_DELTA,
+
+               [FR_TYPE_FLOAT32] = FR_TYPE_FLOAT32,
+               [FR_TYPE_FLOAT64] = FR_TYPE_FLOAT64,
        },
 
        /*
-        *      Various ints get cast to the next highest size which
-        *      can hold their values.
+        *      Integers of the same sign get cast to the larger of
+        *      the data type.  Integers of different signs get cast
+        *      to a *different* data type which can hold all values
+        *      from both sides.
         */
        [FR_TYPE_UINT8] = {
                [FR_TYPE_STRING] = FR_TYPE_UINT8,
index 31be80ee8b3858615ea24f57440e0d889f6f38e8..0c5aa0f39fd7ae4b15dea991b7a9c2eaeb605c88 100644 (file)
@@ -108,7 +108,7 @@ match yes
 #  This should likely be a parse error at boot time?
 #
 xlat_purify 1 < 2 < 3
-match ERROR offset 9: Cannot compare incompatible types (bool)... < (int64)...
+match yes
 
 count
 match 51