From: Alan T. DeKok Date: Thu, 20 Jan 2022 13:53:06 +0000 (-0500) Subject: add more casting for booleans X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1f206894186a82ef85398b53cb39614a16273fe1;p=thirdparty%2Ffreeradius-server.git add more casting for booleans --- diff --git a/src/lib/util/calc.c b/src/lib/util/calc.c index ea5a808486..9fab01ed1a 100644 --- a/src/lib/util/calc.c +++ b/src/lib/util/calc.c @@ -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, diff --git a/src/tests/unit/xlat/purify.txt b/src/tests/unit/xlat/purify.txt index 31be80ee8b..0c5aa0f39f 100644 --- a/src/tests/unit/xlat/purify.txt +++ b/src/tests/unit/xlat/purify.txt @@ -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