From: Nick Porter Date: Thu, 12 Jan 2023 10:00:41 +0000 (+0000) Subject: Set PAIR_LIST_UNKNOWN = 0 to catch where the list is not explicitly set X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7d115e66a3f103f4185c3851a2c3121807aba47;p=thirdparty%2Ffreeradius-server.git Set PAIR_LIST_UNKNOWN = 0 to catch where the list is not explicitly set --- diff --git a/src/bin/unit_test_attribute.c b/src/bin/unit_test_attribute.c index adc8e21a868..762d03d9c36 100644 --- a/src/bin/unit_test_attribute.c +++ b/src/bin/unit_test_attribute.c @@ -2833,6 +2833,7 @@ static size_t command_xlat_normalise(command_result_t *result, command_file_ctx_ .attr = { .dict_def = cc->tmpl_rules.attr.dict_def ? cc->tmpl_rules.attr.dict_def : cc->config->dict, + .list_def = PAIR_LIST_REQUEST, .allow_unresolved = cc->tmpl_rules.attr.allow_unresolved }, }); @@ -2869,6 +2870,7 @@ static size_t command_xlat_expr(command_result_t *result, command_file_ctx_t *cc .dict_def = cc->tmpl_rules.attr.dict_def ? cc->tmpl_rules.attr.dict_def : cc->config->dict, .allow_unresolved = cc->tmpl_rules.attr.allow_unresolved, + .list_def = PAIR_LIST_REQUEST, .list_as_attr = true, } }); @@ -2909,6 +2911,7 @@ static size_t command_xlat_purify(command_result_t *result, command_file_ctx_t * .dict_def = cc->tmpl_rules.attr.dict_def ? cc->tmpl_rules.attr.dict_def : cc->config->dict, .allow_unresolved = cc->tmpl_rules.attr.allow_unresolved, + .list_def = PAIR_LIST_REQUEST, .list_as_attr = true, }, }); @@ -2962,6 +2965,7 @@ static size_t command_xlat_argv(command_result_t *result, command_file_ctx_t *cc .attr = { .dict_def = cc->tmpl_rules.attr.dict_def ? cc->tmpl_rules.attr.dict_def : cc->config->dict, + .list_def = PAIR_LIST_REQUEST, .allow_unresolved = cc->tmpl_rules.attr.allow_unresolved }, }); @@ -3344,6 +3348,8 @@ static command_file_ctx_t *command_ctx_alloc(TALLOC_CTX *ctx, cc->fuzzer_dir = -1; + cc->tmpl_rules.attr.list_def = PAIR_LIST_REQUEST; + return cc; } diff --git a/src/bin/unit_test_map.c b/src/bin/unit_test_map.c index 60f1ba8ad65..62d40d7cd57 100644 --- a/src/bin/unit_test_map.c +++ b/src/bin/unit_test_map.c @@ -84,6 +84,7 @@ static int process_file(char const *filename) tmpl_rules_t parse_rules = { .attr = { .dict_def = dict_radius, + .list_def = PAIR_LIST_REQUEST, .allow_foreign = false, /* tests are in the RADIUS dictionary */ } }; diff --git a/src/bin/unit_test_module.c b/src/bin/unit_test_module.c index b9f1de74e99..12065e49e17 100644 --- a/src/bin/unit_test_module.c +++ b/src/bin/unit_test_module.c @@ -440,9 +440,10 @@ static bool do_xlats(fr_event_list_t *el, char const *filename, FILE *fp) &(tmpl_rules_t) { .attr = { .dict_def = dict_protocol, + .list_def = PAIR_LIST_REQUEST, .allow_unresolved = true, } - } + } ); if (slen <= 0) { talloc_free(xlat_ctx); diff --git a/src/lib/server/cf_file.c b/src/lib/server/cf_file.c index 6a17f14526d..092659148aa 100644 --- a/src/lib/server/cf_file.c +++ b/src/lib/server/cf_file.c @@ -1499,6 +1499,7 @@ static CONF_ITEM *process_if(cf_stack_t *stack) t_rules = (tmpl_rules_t) { .attr = { .dict_def = dict, + .list_def = PAIR_LIST_REQUEST, .allow_unresolved = true, .allow_unknown = true } diff --git a/src/lib/server/cf_parse.c b/src/lib/server/cf_parse.c index 32f5d206403..d3829eac207 100644 --- a/src/lib/server/cf_parse.c +++ b/src/lib/server/cf_parse.c @@ -222,6 +222,7 @@ int cf_pair_parse_value(TALLOC_CTX *ctx, void *out, UNUSED void *base, CONF_ITEM tmpl_t *vpt; static tmpl_rules_t rules = { .attr = { + .list_def = PAIR_LIST_REQUEST, .allow_unknown = true, .allow_unresolved = true, .allow_foreign = true @@ -1221,6 +1222,7 @@ int cf_section_parse_pass2(void *base, CONF_SECTION *cs) &(tmpl_rules_t) { .attr = { .dict_def = dict, + .list_def = PAIR_LIST_REQUEST, .allow_unknown = false, .allow_unresolved = false, .allow_foreign = (dict == NULL) diff --git a/src/lib/server/map.c b/src/lib/server/map.c index 30a4b79531b..cd831828446 100644 --- a/src/lib/server/map.c +++ b/src/lib/server/map.c @@ -1781,6 +1781,7 @@ int map_to_request(request_t *request, map_t const *map, radius_map_getvalue_t f &(tmpl_rules_t){ .attr = { .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .prefix = TMPL_ATTR_REF_PREFIX_NO } }); diff --git a/src/lib/server/map_async.c b/src/lib/server/map_async.c index fdb905e65e9..656426dd196 100644 --- a/src/lib/server/map_async.c +++ b/src/lib/server/map_async.c @@ -323,6 +323,7 @@ int map_to_list_mod(TALLOC_CTX *ctx, vp_list_mod_t **out, &(tmpl_rules_t){ .attr = { .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .prefix = TMPL_ATTR_REF_PREFIX_NO } }); diff --git a/src/lib/server/tmpl_dcursor_tests.c b/src/lib/server/tmpl_dcursor_tests.c index 1455605e67f..99788099365 100644 --- a/src/lib/server/tmpl_dcursor_tests.c +++ b/src/lib/server/tmpl_dcursor_tests.c @@ -133,11 +133,15 @@ typedef struct { static inline CC_HINT(always_inline) int _tmpl_setup_and_cursor_init(fr_pair_t **vp_out, tmpl_dcursor_vars_t *vars, request_t *request, char const *ref) { - tmpl_afrom_attr_substr(autofree, NULL, &vars->vpt, &FR_SBUFF_IN(ref, strlen(ref)), NULL, &(tmpl_rules_t){.attr = {.dict_def = test_dict}}); - TEST_CHECK(vars->vpt!= NULL); - TEST_MSG("Failed creating tmpl from %s: %s", ref, fr_strerror()); - if (!vars->vpt) { - *vp_out = NULL; + tmpl_afrom_attr_substr(autofree, NULL, &vars->vpt, &FR_SBUFF_IN(ref, strlen(ref)), NULL, &(tmpl_rules_t){ + .attr = { + .dict_def = test_dict, + .list_def = PAIR_LIST_REQUEST, + }}); + TEST_CHECK(vars->vpt!= NULL); + TEST_MSG("Failed creating tmpl from %s: %s", ref, fr_strerror()); + if (!vars->vpt) { + *vp_out = NULL; return -1; } @@ -157,11 +161,15 @@ int _tmpl_setup_and_cursor_init(fr_pair_t **vp_out, tmpl_dcursor_vars_t *vars, r static inline CC_HINT(always_inline) int _tmpl_setup_and_cursor_build_init(fr_pair_t **vp_out, tmpl_dcursor_vars_t *vars, request_t *request, char const *ref) { - tmpl_afrom_attr_substr(autofree, NULL, &vars->vpt, &FR_SBUFF_IN(ref, strlen(ref)), NULL, &(tmpl_rules_t){.attr = {.dict_def = test_dict}}); - TEST_CHECK(vars->vpt!= NULL); - TEST_MSG("Failed creating tmpl from %s: %s", ref, fr_strerror()); - if (!vars->vpt) { - *vp_out = NULL; + tmpl_afrom_attr_substr(autofree, NULL, &vars->vpt, &FR_SBUFF_IN(ref, strlen(ref)), NULL, &(tmpl_rules_t){ + .attr = { + .dict_def = test_dict, + .list_def = PAIR_LIST_REQUEST, + }}); + TEST_CHECK(vars->vpt!= NULL); + TEST_MSG("Failed creating tmpl from %s: %s", ref, fr_strerror()); + if (!vars->vpt) { + *vp_out = NULL; return -1; } diff --git a/src/lib/server/tmpl_tokenize.c b/src/lib/server/tmpl_tokenize.c index 874b0faa6a5..155cfc392c0 100644 --- a/src/lib/server/tmpl_tokenize.c +++ b/src/lib/server/tmpl_tokenize.c @@ -96,7 +96,9 @@ TMPL_REQUEST_REF_DEF(tmpl_request_def_parent, REQUEST_PARENT); * Defaults are used if a NULL rules pointer is passed to the parsing function. */ static tmpl_rules_t const default_rules = { - + .attr = { + .list_def = PAIR_LIST_REQUEST, + }, }; @@ -4964,7 +4966,7 @@ void tmpl_verify(char const *file, int line, tmpl_t const *vpt) fr_type_to_str(da->type)); } - if (!vpt->rules.attr.list_as_attr && (tmpl_list(vpt) >= PAIR_LIST_UNKNOWN)) { + if (!vpt->rules.attr.list_as_attr && ((tmpl_list(vpt) == PAIR_LIST_UNKNOWN) || tmpl_list(vpt) > PAIR_LIST_STATE)) { fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%u]: TMPL_TYPE_ATTR " "attribute \"%s\" has invalid list (%i)", file, line, tmpl_attr_tail_da(vpt)->name, tmpl_list(vpt)); diff --git a/src/lib/server/users_file.c b/src/lib/server/users_file.c index 86d2420a76b..176fedf0f09 100644 --- a/src/lib/server/users_file.c +++ b/src/lib/server/users_file.c @@ -272,6 +272,7 @@ int pairlist_read(TALLOC_CTX *ctx, fr_dict_t const *dict, char const *file, PAIR .attr = { .dict_def = dict, .prefix = TMPL_ATTR_REF_PREFIX_NO, + .list_def = PAIR_LIST_REQUEST, .disallow_qualifiers = true, /* for now, until more tests are made */ /* @@ -288,6 +289,7 @@ int pairlist_read(TALLOC_CTX *ctx, fr_dict_t const *dict, char const *file, PAIR .attr = { .dict_def = dict, .prefix = TMPL_ATTR_REF_PREFIX_YES, + .list_def = PAIR_LIST_REQUEST, .disallow_qualifiers = true, /* for now, until rlm_files supports it */ } }; diff --git a/src/lib/server/virtual_servers.c b/src/lib/server/virtual_servers.c index bda76a1b951..bb7a0fedf26 100644 --- a/src/lib/server/virtual_servers.c +++ b/src/lib/server/virtual_servers.c @@ -1224,10 +1224,13 @@ int virtual_servers_instantiate(void) * the process module. */ if (process->compile_list) { - tmpl_rules_t parse_rules; + tmpl_rules_t parse_rules = { + .attr = { + .dict_def = *(process->dict), + .list_def = PAIR_LIST_REQUEST, + }, + }; - memset(&parse_rules, 0, sizeof(parse_rules)); - parse_rules.attr.dict_def = *(process->dict); fr_assert(parse_rules.attr.dict_def != NULL); if (virtual_server_compile_sections(server_cs, process->compile_list, &parse_rules, diff --git a/src/lib/unlang/compile.c b/src/lib/unlang/compile.c index 04c1bc4e3cc..a9377a6bf52 100644 --- a/src/lib/unlang/compile.c +++ b/src/lib/unlang/compile.c @@ -440,6 +440,7 @@ static bool pass2_fixup_cond_map(fr_cond_t *c, CONF_ITEM *ci, fr_dict_t const *d NULL, &(tmpl_rules_t){ .attr = { + .list_def = PAIR_LIST_REQUEST, .allow_unknown = true } }); @@ -2767,6 +2768,8 @@ static unlang_t *compile_section(unlang_t *parent, unlang_compile_t *unlang_ctx, unlang_t *c; char const *name1, *name2; + fr_assert(unlang_ctx->rules != NULL); + fr_assert(unlang_ctx->rules->attr.list_def != PAIR_LIST_UNKNOWN); /* * We always create a group, even if the section is empty. */ @@ -3728,6 +3731,7 @@ static unlang_t *compile_if_subsection(unlang_t *parent, unlang_compile_t *unlan tmpl_rules_t t_rules = (tmpl_rules_t) { .attr = { .dict_def = xr_rules.tr_rules->dict_def, + .list_def = PAIR_LIST_REQUEST, .allow_unresolved = true, .allow_unknown = true } diff --git a/src/lib/unlang/edit.c b/src/lib/unlang/edit.c index 15888b03f2c..76d32faaf43 100644 --- a/src/lib/unlang/edit.c +++ b/src/lib/unlang/edit.c @@ -113,6 +113,7 @@ static int tmpl_attr_from_result(TALLOC_CTX *ctx, map_t const *map, edit_result_ &(tmpl_rules_t){ .attr = { .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .prefix = TMPL_ATTR_REF_PREFIX_NO } }); diff --git a/src/lib/unlang/xlat_builtin.c b/src/lib/unlang/xlat_builtin.c index 99494c17e5b..86f68218f6a 100644 --- a/src/lib/unlang/xlat_builtin.c +++ b/src/lib/unlang/xlat_builtin.c @@ -79,6 +79,7 @@ int xlat_fmt_get_vp(fr_pair_t **out, request_t *request, char const *name) &(tmpl_rules_t){ .attr = { .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .prefix = TMPL_ATTR_REF_PREFIX_AUTO } }) <= 0) return -4; @@ -1152,6 +1153,7 @@ static xlat_action_t xlat_func_debug_attr(UNUSED TALLOC_CTX *ctx, UNUSED fr_dcur &(tmpl_rules_t){ .attr = { .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .prefix = TMPL_ATTR_REF_PREFIX_AUTO } }) <= 0) { @@ -1200,6 +1202,7 @@ static xlat_action_t xlat_func_flatten(UNUSED TALLOC_CTX *ctx, UNUSED fr_dcursor &(tmpl_rules_t){ .attr = { .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .prefix = TMPL_ATTR_REF_PREFIX_AUTO } }) <= 0) { @@ -1246,6 +1249,7 @@ static xlat_action_t xlat_func_unflatten(UNUSED TALLOC_CTX *ctx, UNUSED fr_dcurs &(tmpl_rules_t){ .attr = { .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .prefix = TMPL_ATTR_REF_PREFIX_AUTO } }) <= 0) { @@ -1539,6 +1543,7 @@ static xlat_action_t xlat_func_map(TALLOC_CTX *ctx, fr_dcursor_t *out, tmpl_rules_t attr_rules = { .attr = { .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .prefix = TMPL_ATTR_REF_PREFIX_AUTO } }; @@ -1751,10 +1756,11 @@ static xlat_action_t xlat_func_eval(TALLOC_CTX *ctx, fr_dcursor_t *out, }, &(tmpl_rules_t){ .attr = { + .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .allow_unknown = false, .allow_unresolved = false, .allow_foreign = false, - .dict_def = request->dict }, .at_runtime = true }) < 0) { @@ -1827,10 +1833,11 @@ static xlat_action_t xlat_func_expr(TALLOC_CTX *ctx, fr_dcursor_t *out, }, &(tmpl_rules_t){ .attr = { + .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .allow_unknown = false, .allow_unresolved = false, .allow_foreign = false, - .dict_def = request->dict }, .at_runtime = true }) < 0) { @@ -2744,6 +2751,7 @@ static xlat_action_t xlat_func_pairs(TALLOC_CTX *ctx, fr_dcursor_t *out, &(tmpl_rules_t){ .attr = { .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .prefix = TMPL_ATTR_REF_PREFIX_AUTO } }) <= 0) { @@ -3901,6 +3909,7 @@ static xlat_action_t protocol_encode_xlat(TALLOC_CTX *ctx, fr_dcursor_t *out, &(tmpl_rules_t){ .attr = { .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .prefix = TMPL_ATTR_REF_PREFIX_AUTO } }) <= 0) { diff --git a/src/lib/unlang/xlat_eval.c b/src/lib/unlang/xlat_eval.c index 0e260df1183..ea98acde399 100644 --- a/src/lib/unlang/xlat_eval.c +++ b/src/lib/unlang/xlat_eval.c @@ -1459,7 +1459,8 @@ ssize_t _xlat_eval(TALLOC_CTX *ctx, char **out, size_t outlen, request_t *reques NULL, &(tmpl_rules_t){ .attr = { - .dict_def = request->dict + .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, } }); if (len == 0) { diff --git a/src/listen/ldap_sync/proto_ldap_sync.c b/src/listen/ldap_sync/proto_ldap_sync.c index 97869000c1e..f1a439c4a84 100644 --- a/src/listen/ldap_sync/proto_ldap_sync.c +++ b/src/listen/ldap_sync/proto_ldap_sync.c @@ -286,6 +286,7 @@ static int mod_instantiate(module_inst_ctx_t const *mctx) /* Strict rules for the update map as it's processed with limited functionality */ .attr = { .dict_def = dict_ldap_sync, + .list_def = PAIR_LIST_REQUEST, .allow_foreign = false, .allow_unknown = false, .allow_unresolved = false, diff --git a/src/modules/rlm_cache/rlm_cache.c b/src/modules/rlm_cache/rlm_cache.c index e13e6f03f16..3d7d23bb153 100644 --- a/src/modules/rlm_cache/rlm_cache.c +++ b/src/modules/rlm_cache/rlm_cache.c @@ -845,6 +845,7 @@ xlat_action_t cache_xlat(TALLOC_CTX *ctx, fr_dcursor_t *out, &(tmpl_rules_t){ .attr = { .dict_def = request->dict, + .list_def = PAIR_LIST_REQUEST, .prefix = TMPL_ATTR_REF_PREFIX_AUTO } }); @@ -1013,6 +1014,7 @@ static int mod_instantiate(module_inst_ctx_t const *mctx) { tmpl_rules_t parse_rules = { .attr = { + .list_def = PAIR_LIST_REQUEST, .allow_foreign = true /* Because we don't know where we'll be called */ } }; diff --git a/src/modules/rlm_exec/rlm_exec.c b/src/modules/rlm_exec/rlm_exec.c index 189e25c9005..1d6feac49e9 100644 --- a/src/modules/rlm_exec/rlm_exec.c +++ b/src/modules/rlm_exec/rlm_exec.c @@ -246,6 +246,7 @@ static int mod_instantiate(module_inst_ctx_t const *mctx) T_BACK_QUOTED_STRING, NULL, &(tmpl_rules_t) { .attr = { + .list_def = PAIR_LIST_REQUEST, .allow_foreign = true, .allow_unresolved = false, .allow_unknown = false diff --git a/src/modules/rlm_json/rlm_json.c b/src/modules/rlm_json/rlm_json.c index 2f3863f6b1c..7ddfaa75250 100644 --- a/src/modules/rlm_json/rlm_json.c +++ b/src/modules/rlm_json/rlm_json.c @@ -200,6 +200,7 @@ static xlat_action_t json_encode_xlat(TALLOC_CTX *ctx, fr_dcursor_t *out, &json_arg_parse_rules, &(tmpl_rules_t){ .attr = { + .list_def = PAIR_LIST_REQUEST, .dict_def = request->dict } }); diff --git a/src/modules/rlm_ldap/rlm_ldap.c b/src/modules/rlm_ldap/rlm_ldap.c index 539340f1032..03fa4c6f108 100644 --- a/src/modules/rlm_ldap/rlm_ldap.c +++ b/src/modules/rlm_ldap/rlm_ldap.c @@ -1999,6 +1999,7 @@ static int mod_instantiate(module_inst_ctx_t const *mctx) { tmpl_rules_t parse_rules = { .attr = { + .list_def = PAIR_LIST_REQUEST, .allow_foreign = true /* Because we don't know where we'll be called */ } }; diff --git a/src/modules/rlm_linelog/rlm_linelog.c b/src/modules/rlm_linelog/rlm_linelog.c index 5f0c8bcfc99..f33db0ff84f 100644 --- a/src/modules/rlm_linelog/rlm_linelog.c +++ b/src/modules/rlm_linelog/rlm_linelog.c @@ -528,6 +528,7 @@ static unlang_action_t CC_HINT(nonnull) mod_do_linelog(rlm_rcode_t *p_result, mo NULL, &(tmpl_rules_t){ .attr = { + .list_def = PAIR_LIST_REQUEST, .dict_def = request->dict, .allow_unknown = true, .allow_unresolved = false,