From: Arran Cudbard-Bell Date: Mon, 23 Mar 2020 02:27:25 +0000 (-0600) Subject: cf_parse: Fix the remaining type checks X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a2f6845e1e15b28a4aed3477c53d67a96b044b9f;p=thirdparty%2Ffreeradius-server.git cf_parse: Fix the remaining type checks --- diff --git a/src/lib/server/cf_parse.h b/src/lib/server/cf_parse.h index 6d0d2f408b4..4bfa54cb3cd 100644 --- a/src/lib/server/cf_parse.h +++ b/src/lib/server/cf_parse.h @@ -89,7 +89,7 @@ typedef void conf_type_invalid; //!< Dummy type used to indicate invalid FR_TYP * @param _x pointer to check. * @param _t type to check compatibility with. */ -#define is_compatible(_x, _t) _Generic((_x), _t:1, default: 0) +#define is_compatible(_x, _t) _Generic(_x, _t:1, default: 0) /** Check the type #_t matches the destination data type * @@ -120,6 +120,14 @@ __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_TIME_DELTA) && !((_t) & FR_TY __builtin_choose_expr(is_compatible((_ct), fr_time_delta_t *), _p, (_mismatch_time_delta) 0), \ __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_TIME_DELTA) && ((_t) & FR_TYPE_MULTI), \ __builtin_choose_expr(is_compatible((_ct), fr_time_delta_t **), _p, (_mismatch_time_delta_m) 0), \ +__builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_ETHERNET) && !((_t) & FR_TYPE_MULTI), \ + __builtin_choose_expr(is_compatible((_ct), uint8_t(*)[6]), _p, (_mismatch_ethernet) 0), \ +__builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_ETHERNET) && ((_t) & FR_TYPE_MULTI), \ + __builtin_choose_expr(is_compatible((_ct), uint8_t ***), _p, (_mismatch_ethernet_m) 0), \ +__builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_IFID) && !((_t) & FR_TYPE_MULTI), \ + __builtin_choose_expr(is_compatible((_ct), uint8_t(*)[8]), _p, (_mismatch_ifid) 0), \ +__builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_IFID) && ((_t) & FR_TYPE_MULTI), \ + __builtin_choose_expr(is_compatible((_ct), uint8_t ***), _p, (_mismatch_ifid_m) 0), \ _Generic((_ct), \ vp_tmpl_t ** : __builtin_choose_expr(((_t) & FR_TYPE_TMPL) && !((_t) & FR_TYPE_MULTI), \ _p, (_mismatch_vp_tmpl) 0), \ @@ -163,18 +171,10 @@ _Generic((_ct), \ _p, (_mismatch_uint8) 0), \ uint8_t ** : __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_UINT8) && ((_t) & FR_TYPE_MULTI), \ _p, (_mismatch_uint8_m) 0), \ - uint8_t[8] : __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_IFID) && !(_t & FR_TYPE_MULTI), \ - _p, (_mismatch_ifid) 0), \ - uint8_t*[8] : __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_IFID) && ((_t) & FR_TYPE_MULTI), \ - _p, (_mismatch_ifid_m) 0), \ uint16_t * : __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_UINT16) && !((_t) & FR_TYPE_MULTI), \ _p, (_mismatch_uint16) 0), \ uint16_t ** : __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_UINT16) && ((_t) & FR_TYPE_MULTI), \ _p, (_mismatch_uint16_m) 0), \ - uint8_t[6] : __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_ETHERNET) && !((_t) & FR_TYPE_MULTI), \ - _p, (_mismatch_ethernet) 0), \ - uint8_t*[6] : __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_ETHERNET) && ((_t) & FR_TYPE_MULTI), \ - _p, (_mismatch_ethernet_m) 0), \ int32_t * : __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_INT32) && !((_t) & FR_TYPE_MULTI), \ _p, (_mismatch_int32) 0), \ int32_t ** : __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_INT32) && ((_t) & FR_TYPE_MULTI), \ @@ -191,7 +191,7 @@ _Generic((_ct), \ _p, (_mismatch_double) 0), \ double ** : __builtin_choose_expr((FR_BASE_TYPE(_t) == FR_TYPE_FLOAT64) && ((_t) & FR_TYPE_MULTI), \ _p, (_mismatch_double_m) 0), \ - default: (conf_type_mismatch)0))))))))) + default: (conf_type_mismatch)0))))))))))))) # define FR_CONF_OFFSET(_n, _t, _s, _f) \ .name = _n, \ diff --git a/src/modules/rlm_test/rlm_test.c b/src/modules/rlm_test/rlm_test.c index 6444f1dc2bd..d56f7399cf3 100644 --- a/src/modules/rlm_test/rlm_test.c +++ b/src/modules/rlm_test/rlm_test.c @@ -77,13 +77,25 @@ typedef struct { uint8_t *byte_m; uint8_t ifid[8]; - uint8_t *ifid_m[8]; - + /* + * clang correctly performs type compatibility checks between + * arrays with a specific length, but for pointers to pointers + * to arrays of specific length + * (which is what FR_TYPE_CONF_CHECK receives) the check doesn't + * seem to work. + * + * So the "multi" variants of ethernet and ifid buffers, must + * be a **. + */ + uint8_t **ifid_m; uint16_t shortint; - uint16_t shortint_m; + uint16_t *shortint_m; uint8_t ethernet[6]; - uint8_t ethernet_m[6]; + /* + * See above... + */ + uint8_t **ethernet_m; int32_t int32; int32_t *int32_m;