]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
fr_pair_list_afrom_str() now takes a dict_attr root, not dict
authorAlan T. DeKok <aland@freeradius.org>
Sat, 11 Dec 2021 13:30:58 +0000 (08:30 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Sat, 11 Dec 2021 13:30:58 +0000 (08:30 -0500)
in preparation for allowing structural attributes to be parsed
from strings.

This helps with not only intermediate tests while the new edit
code is being developed, it allows for pairs to be assigned
as the result of xlat / exec expansions.  Which gives a fair bit
more generality to the server.

src/bin/radsniff.c
src/bin/unit_test_attribute.c
src/lib/server/exec_legacy.c
src/lib/util/pair.c
src/lib/util/pair_legacy.c
src/lib/util/pair_legacy.h
src/lib/util/pair_legacy_tests.c
src/lib/util/pair_list_perf_test.c
src/listen/detail/proto_detail.c

index 4c2b07848ee9c61b8fc6a2f399c54cb1ba46dc26..03183af17764b59c17396dc18d12ec1c0cac973e 100644 (file)
@@ -2032,7 +2032,7 @@ static int rs_build_filter(fr_pair_list_t *out, char const *filter)
 {
        fr_token_t code;
 
-       code = fr_pair_list_afrom_str(conf, dict_radius, filter, strlen(filter), out);
+       code = fr_pair_list_afrom_str(conf, fr_dict_root(dict_radius), filter, strlen(filter), out);
        if (code == T_INVALID) {
                fr_perror("Invalid RADIUS filter \"%s\"", filter);
                return -1;
index 69049f309ed0549b554f61d4b9262865b438f731..de3f168f1cf2b8e450ac8e048fe9d2c9bf9c5c95 100644 (file)
@@ -1149,10 +1149,11 @@ static size_t command_normalise_attribute(command_result_t *result, command_file
 {
        fr_pair_list_t  head;
        ssize_t         slen;
+       fr_dict_t const *dict = cc->tmpl_rules.dict_def ? cc->tmpl_rules.dict_def : cc->config->dict;
 
        fr_pair_list_init(&head);
 
-       if (fr_pair_list_afrom_str(NULL, cc->tmpl_rules.dict_def ? cc->tmpl_rules.dict_def : cc->config->dict, in, inlen, &head) != T_EOL) {
+       if (fr_pair_list_afrom_str(NULL, fr_dict_root(dict), in, inlen, &head) != T_EOL) {
                RETURN_OK_WITH_ERROR();
        }
 
@@ -1815,6 +1816,7 @@ static size_t command_encode_pair(command_result_t *result, command_file_ctx_t *
        bool            truncate = false;
 
        size_t          iterations = 0;
+       fr_dict_t const *dict;
 
        fr_pair_list_init(&head);
        slen = load_test_point_by_command((void **)&tp, p, "tp_encode_pair");
@@ -1849,7 +1851,8 @@ static size_t command_encode_pair(command_result_t *result, command_file_ctx_t *
                RETURN_COMMAND_ERROR();
        }
 
-       if (fr_pair_list_afrom_str(cc->tmp_ctx, cc->tmpl_rules.dict_def ? cc->tmpl_rules.dict_def : cc->config->dict,
+       dict = cc->tmpl_rules.dict_def ? cc->tmpl_rules.dict_def : cc->config->dict;
+       if (fr_pair_list_afrom_str(cc->tmp_ctx, fr_dict_root(dict),
                                   p, in + inlen - p, &head) != T_EOL) {
                CLEAR_TEST_POINT(cc);
                RETURN_OK_WITH_ERROR();
@@ -1992,6 +1995,8 @@ static size_t command_encode_proto(command_result_t *result, command_file_ctx_t
        char            *p = in;
 
        fr_pair_list_t  head;
+       fr_dict_t const *dict;
+
        fr_pair_list_init(&head);
 
        slen = load_test_point_by_command((void **)&tp, p, "tp_encode_proto");
@@ -2009,7 +2014,8 @@ static size_t command_encode_proto(command_result_t *result, command_file_ctx_t
                RETURN_COMMAND_ERROR();
        }
 
-       if (fr_pair_list_afrom_str(cc->tmp_ctx, cc->tmpl_rules.dict_def ? cc->tmpl_rules.dict_def : cc->config->dict,
+       dict = cc->tmpl_rules.dict_def ? cc->tmpl_rules.dict_def : cc->config->dict;
+       if (fr_pair_list_afrom_str(cc->tmp_ctx, fr_dict_root(dict),
                                   p, in + inlen - p, &head) != T_EOL) {
                CLEAR_TEST_POINT(cc);
                RETURN_OK_WITH_ERROR();
index a37cda435f0b6143411e476d141de90fc9f6d233..e22aefa38bb250d5df3340b2f78ede5f8a924a30 100644 (file)
@@ -579,7 +579,7 @@ int radius_exec_program_legacy(TALLOC_CTX *ctx, char *out, size_t outlen, fr_pai
                        answer[--len] = '\0';
                }
 
-               if (fr_pair_list_afrom_str(ctx, request->dict, answer, sizeof(answer), &vps) == T_INVALID) {
+               if (fr_pair_list_afrom_str(ctx, fr_dict_root(request->dict), answer, sizeof(answer), &vps) == T_INVALID) {
                        RPERROR("Failed parsing output from: %s", cmd);
                        if (out) strlcpy(out, answer, len);
                        ret = -1;
index 5ca5ea3e0daa365393af339126eef00014450d3c..beec606f42e7c4cabba71df4a9282dc5e0aae3b4 100644 (file)
@@ -2840,7 +2840,7 @@ void fr_pair_list_afrom_box(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_t cons
         */
        if (last_comma) *last_comma = '\0';
 
-       if (fr_pair_list_afrom_str(ctx, dict, box->vb_strvalue, box->vb_length, out) == T_INVALID) {
+       if (fr_pair_list_afrom_str(ctx, fr_dict_root(dict), box->vb_strvalue, box->vb_length, out) == T_INVALID) {
                return;
        }
 
index 2aa6b428541974b58e868c0ea0e0b44560ecff40..fb9a08af80d1899a5464ead901c98483dbe8422e 100644 (file)
@@ -470,18 +470,18 @@ static ssize_t fr_pair_list_afrom_substr(TALLOC_CTX *ctx, fr_dict_attr_t const *
  * @note the valuepair list should probably be freed.
  *
  * @param[in] ctx      for talloc
- * @param[in] dict     to resolve attributes in.
+ * @param[in] parent   parent attribute for resolution
  * @param[in] buffer   to read valuepairs from.
  * @param[in] len      length of the buffer
  * @param[in] list     where the parsed fr_pair_ts will be appended.
  * @return the last token parsed, or #T_INVALID
  */
-fr_token_t fr_pair_list_afrom_str(TALLOC_CTX *ctx, fr_dict_t const *dict, char const *buffer, size_t len, fr_pair_list_t *list)
+fr_token_t fr_pair_list_afrom_str(TALLOC_CTX *ctx, fr_dict_attr_t const *parent, char const *buffer, size_t len, fr_pair_list_t *list)
 {
        fr_token_t token;
        fr_pair_t       *relative_vp = NULL;
 
-       (void) fr_pair_list_afrom_substr(ctx, fr_dict_root(dict), buffer, buffer + len, list, &token, 0, &relative_vp);
+       (void) fr_pair_list_afrom_substr(ctx, parent, buffer, buffer + len, list, &token, 0, &relative_vp);
        return token;
 }
 
index 9568adac34d6c63c5525ac2e1d5c738ad0d55e42..db9d47dc9a5f9646c9e39ae664c6235f8bae1d53 100644 (file)
@@ -37,7 +37,7 @@ extern "C" {
 fr_pair_t      *fr_pair_make(TALLOC_CTX *ctx, fr_dict_t const *dict,
                              fr_pair_list_t *vps, char const *attribute, char const *value);
 
-fr_token_t     fr_pair_list_afrom_str(TALLOC_CTX *ctx, fr_dict_t const *dict,
+fr_token_t     fr_pair_list_afrom_str(TALLOC_CTX *ctx, fr_dict_attr_t const *parent,
                                       char const *buffer, size_t len, fr_pair_list_t *head);
 int            fr_pair_list_afrom_file(TALLOC_CTX *ctx, fr_dict_t const *dict,
                                        fr_pair_list_t *out, FILE *fp, bool *pfiledone);
index e9f4bef8c93e70138ca2a341fe0db9e6758c893a..327c1c66bd4778347403c5ace0f7feb6841ad75c 100644 (file)
@@ -112,7 +112,7 @@ static void test_fr_pair_list_afrom_str(void)
        fr_pair_list_init(&list);
 
        TEST_CASE("Create 'vp' using fr_pair_list_afrom_str()");
-       TEST_CHECK(fr_pair_list_afrom_str(autofree, test_dict, buffer, strlen(buffer), &list) == T_EOL);
+       TEST_CHECK(fr_pair_list_afrom_str(autofree, fr_dict_root(test_dict), buffer, strlen(buffer), &list) == T_EOL);
 
        TEST_CASE("Looking for Test-Uint32-0");
        TEST_CHECK((vp = fr_pair_find_by_da_idx(&list, fr_dict_attr_test_uint32, 0)) != NULL);
index 179974ec0322306749995213d522f2a038863ef9..82d4ed8e60a1111aac9420fda39b5b6a38854749 100644 (file)
@@ -201,7 +201,7 @@ static void pair_list_init(TALLOC_CTX *ctx, fr_pair_t ***out, fr_dict_t const *d
                while ((p = strchr(p, '#'))) {
                        *p = (char)(i + 48);
                }
-               ret = fr_pair_list_afrom_str(ctx, dict, prep_pairs, strlen(prep_pairs), &list);
+               ret = fr_pair_list_afrom_str(ctx, fr_dict_root(dict), prep_pairs, strlen(prep_pairs), &list);
                if (ret == T_INVALID) fr_perror("pair_list_perf_tests");
                TEST_ASSERT(ret != T_INVALID);
 
index 9d617087c5aa0592ad57074ed570b7e99b22f53d..090e06c5dbf0af4a412942f39d8a8bd1a267103f 100644 (file)
@@ -292,7 +292,7 @@ static int mod_decode(void const *instance, request_t *request, uint8_t *const d
                 *      Ensure temporary list is empty before each use
                 */
                fr_pair_list_free(&tmp_list);
-               if ((fr_pair_list_afrom_str(request->request_ctx, request->dict, (char const *) p, (data + data_len) - p, &tmp_list) > 0) && !fr_pair_list_empty(&tmp_list)) {
+               if ((fr_pair_list_afrom_str(request->request_ctx, fr_dict_root(request->dict), (char const *) p, (data + data_len) - p, &tmp_list) > 0) && !fr_pair_list_empty(&tmp_list)) {
                        vp = fr_pair_list_head(&tmp_list);
                        fr_pair_list_append(&request->request_pairs, &tmp_list);
                } else {