From: Arran Cudbard-Bell Date: Fri, 24 Jun 2022 20:12:47 +0000 (-0500) Subject: Print request refs correctly X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5a4b63c2a8bfa3c0837839d66b7295591e41a341;p=thirdparty%2Ffreeradius-server.git Print request refs correctly --- diff --git a/src/lib/ldap/map.c b/src/lib/ldap/map.c index 2fb818b3784..f67d0bfbb7f 100644 --- a/src/lib/ldap/map.c +++ b/src/lib/ldap/map.c @@ -113,11 +113,20 @@ int fr_ldap_map_getvalue(TALLOC_CTX *ctx, fr_pair_list_t *out, request_t *reques continue; } - if (tmpl_request(attr->lhs) != tmpl_request(map->lhs)) { + if (tmpl_request_ref_list_cmp(tmpl_request(attr->lhs), tmpl_request(map->lhs)) != 0) { + char *attr_request; + char *map_request; + + tmpl_request_ref_list_aprint(NULL, &attr_request, tmpl_request(attr->lhs)); + tmpl_request_ref_list_aprint(NULL, &map_request, tmpl_request(map->lhs)); + RWDEBUG("valuepair \"%pV\" has conflicting request qualifier (%s vs %s), skipping...", fr_box_strvalue_len(self->values[i]->bv_val, self->values[i]->bv_len), - fr_table_str_by_value(tmpl_request_ref_table, tmpl_request(attr->lhs), ""), - fr_table_str_by_value(tmpl_request_ref_table, tmpl_request(map->lhs), "")); + attr_request, map_request); + + talloc_free(attr_request); + talloc_free(map_request); + next_pair: talloc_free(attr); continue; diff --git a/src/lib/server/tmpl.h b/src/lib/server/tmpl.h index bcca9d9b5c7..ff0e33d9a91 100644 --- a/src/lib/server/tmpl.h +++ b/src/lib/server/tmpl.h @@ -1071,12 +1071,28 @@ ssize_t tmpl_regex_compile(tmpl_t *vpt, bool subcaptures) CC_HINT(nonnull); /** @name Print the contents of a #tmpl_t * @{ */ -ssize_t tmpl_attr_print(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) CC_HINT(nonnull(1)); +fr_slen_t tmpl_request_ref_list_print(fr_sbuff_t *out, FR_DLIST_HEAD(tmpl_request_list) const *rql) + CC_HINT(nonnull(1,2)); -ssize_t tmpl_print(fr_sbuff_t *out, tmpl_t const *vpt, - tmpl_attr_prefix_t ar_prefix, fr_sbuff_escape_rules_t const *e_rules) CC_HINT(nonnull(1)); +static inline fr_slen_t tmpl_request_ref_list_aprint(TALLOC_CTX *ctx, char **out, FR_DLIST_HEAD(tmpl_request_list) const *rql) + SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(tmpl_request_ref_list_print, rql) -ssize_t tmpl_print_quoted(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) CC_HINT(nonnull); +fr_slen_t tmpl_attr_print(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) CC_HINT(nonnull(1,2)); + +static inline fr_slen_t tmpl_attr_aprint(TALLOC_CTX *ctx, char **out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) + SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(tmpl_attr_print, vpt, ar_prefix) + +fr_slen_t tmpl_print(fr_sbuff_t *out, tmpl_t const *vpt, + tmpl_attr_prefix_t ar_prefix, fr_sbuff_escape_rules_t const *e_rules) CC_HINT(nonnull(1,2)); + +static inline fr_slen_t tmpl_aprint(TALLOC_CTX *ctx, char **out, tmpl_t const *vpt, + tmpl_attr_prefix_t ar_prefix, fr_sbuff_escape_rules_t const *e_rules) + SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(tmpl_print, vpt, ar_prefix, e_rules) + +fr_slen_t tmpl_print_quoted(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) CC_HINT(nonnull); + +static inline fr_slen_t tmpl_aprint_quoted(TALLOC_CTX *ctx, char **out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) + SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(tmpl_print_quoted, vpt, ar_prefix) /** @} */ /** @name Expand the tmpl, returning one or more values diff --git a/src/lib/server/tmpl_tokenize.c b/src/lib/server/tmpl_tokenize.c index fd24d0732bb..402c4bda978 100644 --- a/src/lib/server/tmpl_tokenize.c +++ b/src/lib/server/tmpl_tokenize.c @@ -4220,6 +4220,22 @@ ssize_t tmpl_regex_compile(tmpl_t *vpt, bool subcaptures) /** @name Print the contents of a #tmpl_t * @{ */ +fr_slen_t tmpl_request_ref_list_print(fr_sbuff_t *out, FR_DLIST_HEAD(tmpl_request_list) const *rql) +{ + fr_sbuff_t our_out = FR_SBUFF(out); + tmpl_request_t *rr = tmpl_request_list_head(rql); + + /* + * Print request references + */ + while (rr) { + FR_SBUFF_IN_TABLE_STR_RETURN(&our_out, tmpl_request_ref_table, rr->request, ""); + rr = tmpl_request_list_next(rql, rr); + if (rr) FR_SBUFF_IN_CHAR_RETURN(&our_out, '.'); + } + + return fr_sbuff_set(out, &our_out); +} /** Print an attribute or list #tmpl_t to a string * @@ -4238,15 +4254,13 @@ ssize_t tmpl_regex_compile(tmpl_t *vpt, bool subcaptures) * - 0 invalid argument. * - <0 the number of bytes we would have needed to complete the print. */ -ssize_t tmpl_attr_print(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) +fr_slen_t tmpl_attr_print(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) { - tmpl_request_t *rr = NULL; tmpl_attr_t *ar = NULL; fr_da_stack_t stack; char printed_rr = false; fr_sbuff_t our_out = FR_SBUFF(out); - - if (unlikely(!vpt)) return 0; + fr_slen_t slen; TMPL_VERIFY(vpt); @@ -4275,12 +4289,9 @@ ssize_t tmpl_attr_print(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t a /* * Print request references */ - while ((rr = tmpl_request_list_next(&vpt->data.attribute.rr, rr))) { - if (rr->request == REQUEST_CURRENT) continue; /* Don't print the default request */ - - FR_SBUFF_IN_TABLE_STR_RETURN(&our_out, tmpl_request_ref_table, rr->request, ""); - printed_rr = true; - } + slen = tmpl_request_ref_list_print(&our_out, &vpt->data.attribute.rr); + if (slen > 0) printed_rr = true; + if (slen < 0) return slen; /* * Print list @@ -4463,8 +4474,8 @@ ssize_t tmpl_attr_print(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t a * - 0 invalid argument. * - <0 the number of bytes we would have needed to complete the print. */ -ssize_t tmpl_print(fr_sbuff_t *out, tmpl_t const *vpt, - tmpl_attr_prefix_t ar_prefix, fr_sbuff_escape_rules_t const *e_rules) +fr_slen_t tmpl_print(fr_sbuff_t *out, tmpl_t const *vpt, + tmpl_attr_prefix_t ar_prefix, fr_sbuff_escape_rules_t const *e_rules) { fr_sbuff_t our_out = FR_SBUFF(out); @@ -4543,7 +4554,7 @@ ssize_t tmpl_print(fr_sbuff_t *out, tmpl_t const *vpt, * - 0 invalid argument. * - <0 the number of bytes we would have needed to complete the print. */ -ssize_t tmpl_print_quoted(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) +fr_slen_t tmpl_print_quoted(fr_sbuff_t *out, tmpl_t const *vpt, tmpl_attr_prefix_t ar_prefix) { fr_sbuff_t our_out = FR_SBUFF(out);