From: Alan T. DeKok Date: Tue, 5 Sep 2023 13:37:04 +0000 (-0400) Subject: if aavailable, check the enum name at parse time X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=38f1c442f68e0977b4ca43f512968db5e85b7740;p=thirdparty%2Ffreeradius-server.git if aavailable, check the enum name at parse time --- diff --git a/src/lib/server/tmpl_tokenize.c b/src/lib/server/tmpl_tokenize.c index c091e59e1c8..41366b23b6e 100644 --- a/src/lib/server/tmpl_tokenize.c +++ b/src/lib/server/tmpl_tokenize.c @@ -2855,9 +2855,12 @@ static ssize_t tmpl_afrom_enum(TALLOC_CTX *ctx, tmpl_t **out, fr_sbuff_t *in, fr_sbuff_parse_error_t sberr; fr_sbuff_t our_in = FR_SBUFF(in); - if (!fr_sbuff_is_str_literal(&our_in, "::")) return 0; + if (fr_sbuff_is_str_literal(&our_in, "::")) { + (void) fr_sbuff_advance(&our_in, 2); - (void) fr_sbuff_advance(&our_in, 2); + } else if (!t_rules->enumv) { + return 0; + } vpt = tmpl_alloc_null(ctx); @@ -2891,6 +2894,23 @@ static ssize_t tmpl_afrom_enum(TALLOC_CTX *ctx, tmpl_t **out, fr_sbuff_t *in, FR_SBUFF_ERROR_RETURN(&our_in); } + /* + * If there's a valid enum name, then we use it. Otherwise we leave name resolution to run time. + */ + if (t_rules->enumv) { + fr_dict_enum_value_t *dv; + + dv = fr_dict_enum_by_name(t_rules->enumv, str, -1); + if (dv) { + tmpl_init(vpt, TMPL_TYPE_DATA, T_BARE_WORD, + fr_sbuff_start(&our_in), fr_sbuff_used(&our_in), t_rules); + (void) fr_value_box_copy(vpt, &vpt->data.literal, dv->value); + + *out = vpt; + FR_SBUFF_SET_RETURN(in, &our_in); + } + } + tmpl_init(vpt, TMPL_TYPE_DATA_UNRESOLVED, T_BARE_WORD, fr_sbuff_start(&our_in), fr_sbuff_used(&our_in), t_rules); vpt->data.unescaped = str;