]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
cf_parse: Fix the remaining type checks
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Mon, 23 Mar 2020 02:27:25 +0000 (20:27 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Mon, 23 Mar 2020 02:29:24 +0000 (20:29 -0600)
src/lib/server/cf_parse.h
src/modules/rlm_test/rlm_test.c

index 6d0d2f408b42b77bbe318e53a9934cf96dd9b084..4bfa54cb3cd573fbbfe1290f375f3c0b19244a0d 100644 (file)
@@ -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, \
index 6444f1dc2bd42f99d03d434ea69c9ea7f3688168..d56f7399cf31713256cab1fd7c7426b0ae1dcc32 100644 (file)
@@ -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;