From: Alan T. DeKok Date: Sat, 9 Sep 2023 11:50:02 +0000 (-0400) Subject: allow unknown attributes to be relative, too. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6656df4d19801756f5421bf803b324d2bbf310c7;p=thirdparty%2Ffreeradius-server.git allow unknown attributes to be relative, too. As part of a general cleanup and rearrangement, fix the code, have less code, and make it more functional --- diff --git a/src/lib/util/pair_legacy.c b/src/lib/util/pair_legacy.c index db63beeed5d..8f3c3b99384 100644 --- a/src/lib/util/pair_legacy.c +++ b/src/lib/util/pair_legacy.c @@ -113,8 +113,9 @@ static ssize_t fr_pair_list_afrom_substr(TALLOC_CTX *ctx, fr_dict_attr_t const * while (true) { ssize_t slen; fr_token_t op; - fr_dict_attr_t const *da; + fr_dict_attr_t const *da, *my_parent; fr_dict_attr_t *da_unknown = NULL; + fr_dict_attr_err_t err; fr_skip_whitespace(p); @@ -138,12 +139,9 @@ static ssize_t fr_pair_list_afrom_substr(TALLOC_CTX *ctx, fr_dict_attr_t const * } /* - * Hacky hack... + * Relative attributes can only exist if there's a relative VP parent. */ - if (strncmp(p, "raw.", 4) == 0) goto do_unknown; - if (*p == '.') { - fr_dict_attr_err_t err; p++; if (!*relative_vp) { @@ -151,49 +149,48 @@ static ssize_t fr_pair_list_afrom_substr(TALLOC_CTX *ctx, fr_dict_attr_t const * goto error; } - // @todo - allow "...." to go back up a hierarchy - - slen = fr_dict_attr_by_oid_substr(&err, &da, (*relative_vp)->da, &FR_SBUFF_IN(p, (end - p)), &bareword_terminals); - if (err != FR_DICT_ATTR_OK) goto error; - + my_parent = (*relative_vp)->da; my_list = &(*relative_vp)->vp_group; my_ctx = *relative_vp; } else { - fr_dict_attr_err_t err; - /* * We can find an attribute from the parent, but if the path is fully specified, * then we reset any relative VP. So that the _next_ line we parse cannot use * ".foo = bar" to get a relative attribute which was used when parsing _this_ * line. */ + my_parent = parent; *relative_vp = NULL; + my_list = list; + my_ctx = ctx; /* - * Parse the name. + * Raw attributes get a special parser. */ - slen = fr_dict_attr_by_oid_substr(&err, &da, parent, &FR_SBUFF_IN(p, (end - p)), &bareword_terminals); - if ((err != FR_DICT_ATTR_OK) && internal) { - slen = fr_dict_attr_by_oid_substr(&err, &da, internal, - &FR_SBUFF_IN(p, (end - p)), &bareword_terminals); - } - if (err != FR_DICT_ATTR_OK) { - do_unknown: - slen = fr_dict_unknown_afrom_oid_substr(ctx, NULL, &da_unknown, parent, - &FR_SBUFF_IN(p, (end - p)), &bareword_terminals); - if (slen < 0) { - p += -slen; - - error: - *token = T_INVALID; - return -(p - buffer); - } - - da = da_unknown; + if (strncmp(p, "raw.", 4) == 0) goto do_unknown; + } + + /* + * Parse the name. + */ + slen = fr_dict_attr_by_oid_substr(&err, &da, my_parent, &FR_SBUFF_IN(p, (end - p)), &bareword_terminals); + if ((err != FR_DICT_ATTR_OK) && internal) { + slen = fr_dict_attr_by_oid_substr(&err, &da, internal, + &FR_SBUFF_IN(p, (end - p)), &bareword_terminals); + } + if (err != FR_DICT_ATTR_OK) { + do_unknown: + slen = fr_dict_unknown_afrom_oid_substr(ctx, NULL, &da_unknown, my_parent, + &FR_SBUFF_IN(p, (end - p)), &bareword_terminals); + if (slen < 0) { + p += -slen; + + error: + *token = T_INVALID; + return -(p - buffer); } - my_list = list; - my_ctx = ctx; + da = da_unknown; } next = p + slen;