From: Alan T. DeKok Date: Sun, 10 Jan 2021 19:33:53 +0000 (-0500) Subject: move to switch statements / arrays X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=265ec2242f7ad39da5f42b87d84df6a953b1d77a;p=thirdparty%2Ffreeradius-server.git move to switch statements / arrays so that types don't need to be ordered --- diff --git a/src/lib/server/cond_tokenize.c b/src/lib/server/cond_tokenize.c index d868d826bed..b2b88abe1af 100644 --- a/src/lib/server/cond_tokenize.c +++ b/src/lib/server/cond_tokenize.c @@ -458,7 +458,11 @@ set_types: case T_OP_LE: case T_OP_GT: case T_OP_GE: - cast_type++; /* addr -> prefix */ + if (cast_type == FR_TYPE_IPV4_ADDR) { + cast_type = FR_TYPE_IPV4_PREFIX; + } else { + cast_type = FR_TYPE_IPV6_PREFIX; + } break; } } diff --git a/src/lib/util/types.h b/src/lib/util/types.h index 7edd22040f0..b35f493e2b5 100644 --- a/src/lib/util/types.h +++ b/src/lib/util/types.h @@ -29,9 +29,7 @@ RCSIDH(types_h, "$Id$") extern "C" { #endif -/** Internal data types used within libfreeradius - * - * Order is important! Please see fr_type_promote() for details. +/** Internal data types */ typedef enum { FR_TYPE_INVALID = 0, //!< Invalid (uninitialised) attribute type. diff --git a/src/lib/util/value.c b/src/lib/util/value.c index 9aba3742a2c..e91aa430569 100644 --- a/src/lib/util/value.c +++ b/src/lib/util/value.c @@ -5237,6 +5237,18 @@ static const bool type_cast_table[FR_TYPE_MAX][FR_TYPE_MAX] = { }; +/* + * This is different from FR_TYPE_NUMERIC, largely in that it + * doesn't include FR_TYPE_DATE. Because we know that dates + * always have values 2^31 or greater, so casts exclude some of + * the smaller integer types. + */ +static const bool type_is_number[FR_TYPE_MAX] = { + O(BOOL), O(SIZE), O(FLOAT32), O(FLOAT64), + O(UINT8), O(UINT16), O(UINT32), O(UINT64), + O(INT8), O(INT16), O(INT32), O(INT64), + O(TIME_DELTA), +}; /** Return if we're allowed to cast the types. * @@ -5249,8 +5261,21 @@ bool fr_type_cast(fr_type_t dst, fr_type_t src) /* * Invalid casts. */ - if ((dst == FR_TYPE_INVALID) || (src >= FR_TYPE_TLV)) return false; - if ((src == FR_TYPE_INVALID) || (dst >= FR_TYPE_TLV)) return false; + switch (dst) { + case FR_TYPE_NON_VALUES: + return false; + + default: + break; + } + + switch (src) { + case FR_TYPE_NON_VALUES: + return false; + + default: + break; + } if (src == dst) return true; @@ -5272,8 +5297,7 @@ bool fr_type_cast(fr_type_t dst, fr_type_t src) * integer-style thing. Mostly. We do run-time checks * on values to see if they fit. */ - if (((src >= FR_TYPE_BOOL) && (src <= FR_TYPE_TIME_DELTA)) && - ((dst >= FR_TYPE_BOOL) && (dst <= FR_TYPE_TIME_DELTA))) { + if (type_is_number[src] && type_is_number[dst]) { return true; } @@ -5518,8 +5542,21 @@ fr_type_t fr_type_promote(fr_type_t a, fr_type_t b) /* * Invalid types */ - if ((a == FR_TYPE_INVALID) || (a >= FR_TYPE_TLV)) return FR_TYPE_INVALID; - if ((b == FR_TYPE_INVALID) || (b >= FR_TYPE_TLV)) return FR_TYPE_INVALID; + switch (a) { + case FR_TYPE_NON_VALUES: + return FR_TYPE_INVALID; + + default: + break; + } + + switch (b) { + case FR_TYPE_NON_VALUES: + return FR_TYPE_INVALID; + + default: + break; + } if (a == b) return a;