]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Print request refs correctly
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 24 Jun 2022 20:12:47 +0000 (15:12 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Fri, 24 Jun 2022 20:12:47 +0000 (15:12 -0500)
src/lib/ldap/map.c
src/lib/server/tmpl.h
src/lib/server/tmpl_tokenize.c

index 2fb818b3784ec96ea43d8dc8386387f0ca11a222..f67d0bfbb7f16170e25c7c913daf7c1af6333b32 100644 (file)
@@ -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), "<INVALID>"),
-                                       fr_table_str_by_value(tmpl_request_ref_table, tmpl_request(map->lhs), "<INVALID>"));
+                                       attr_request, map_request);
+
+                               talloc_free(attr_request);
+                               talloc_free(map_request);
+
                        next_pair:
                                talloc_free(attr);
                                continue;
index bcca9d9b5c7b96afe136a9a3a3edf77f44f8876c..ff0e33d9a914f463b9e4f009c6c18a7b39d7c712 100644 (file)
@@ -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
index fd24d0732bb1aa7aef70f6507cb1bc5a0732bb18..402c4bda978311727231315cea0c7a8f9e4adb5f 100644 (file)
@@ -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, "<INVALID>");
+               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, "<INVALID>");
-               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);