From: Alan T. DeKok Date: Sat, 11 Dec 2021 13:30:58 +0000 (-0500) Subject: fr_pair_list_afrom_str() now takes a dict_attr root, not dict X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b3f5594af4d20f4b70c6e15f9a2292db7be7b17;p=thirdparty%2Ffreeradius-server.git fr_pair_list_afrom_str() now takes a dict_attr root, not dict 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. --- diff --git a/src/bin/radsniff.c b/src/bin/radsniff.c index 4c2b07848e..03183af177 100644 --- a/src/bin/radsniff.c +++ b/src/bin/radsniff.c @@ -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; diff --git a/src/bin/unit_test_attribute.c b/src/bin/unit_test_attribute.c index 69049f309e..de3f168f1c 100644 --- a/src/bin/unit_test_attribute.c +++ b/src/bin/unit_test_attribute.c @@ -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(); diff --git a/src/lib/server/exec_legacy.c b/src/lib/server/exec_legacy.c index a37cda435f..e22aefa38b 100644 --- a/src/lib/server/exec_legacy.c +++ b/src/lib/server/exec_legacy.c @@ -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; diff --git a/src/lib/util/pair.c b/src/lib/util/pair.c index 5ca5ea3e0d..beec606f42 100644 --- a/src/lib/util/pair.c +++ b/src/lib/util/pair.c @@ -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; } diff --git a/src/lib/util/pair_legacy.c b/src/lib/util/pair_legacy.c index 2aa6b42854..fb9a08af80 100644 --- a/src/lib/util/pair_legacy.c +++ b/src/lib/util/pair_legacy.c @@ -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; } diff --git a/src/lib/util/pair_legacy.h b/src/lib/util/pair_legacy.h index 9568adac34..db9d47dc9a 100644 --- a/src/lib/util/pair_legacy.h +++ b/src/lib/util/pair_legacy.h @@ -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); diff --git a/src/lib/util/pair_legacy_tests.c b/src/lib/util/pair_legacy_tests.c index e9f4bef8c9..327c1c66bd 100644 --- a/src/lib/util/pair_legacy_tests.c +++ b/src/lib/util/pair_legacy_tests.c @@ -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); diff --git a/src/lib/util/pair_list_perf_test.c b/src/lib/util/pair_list_perf_test.c index 179974ec03..82d4ed8e60 100644 --- a/src/lib/util/pair_list_perf_test.c +++ b/src/lib/util/pair_list_perf_test.c @@ -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); diff --git a/src/listen/detail/proto_detail.c b/src/listen/detail/proto_detail.c index 9d617087c5..090e06c5db 100644 --- a/src/listen/detail/proto_detail.c +++ b/src/listen/detail/proto_detail.c @@ -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 {