]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
squash the nested names down when debugging
authorAlan T. DeKok <aland@freeradius.org>
Wed, 14 Jan 2026 16:33:30 +0000 (11:33 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 14 Jan 2026 23:26:33 +0000 (18:26 -0500)
src/lib/unlang/edit.c
src/lib/unlang/xlat_builtin.c
src/lib/util/pair.h
src/lib/util/pair_legacy.c
src/lib/util/pair_print.c

index 2524ea58ad29a2cc7ea0c83d8c773ee42cc3eae6..e8098556336d48b52732fee46cc3bceb4a076bb8 100644 (file)
@@ -211,7 +211,7 @@ static int tmpl_to_values(TALLOC_CTX *ctx, edit_result_t *out, request_t *reques
 
 static void edit_debug_attr_list(request_t *request, fr_pair_list_t const *list, map_t const *map);
 
-static void edit_debug_attr_vp(request_t *request, fr_pair_t *vp, map_t const *map)
+static void edit_debug_attr_vp(request_t *request, fr_pair_t const *vp, map_t const *map)
 {
        fr_assert(vp != NULL);
 
@@ -230,9 +230,28 @@ static void edit_debug_attr_vp(request_t *request, fr_pair_t *vp, map_t const *m
                        break;
                }
        } else {
+               size_t slen;
+               char const *name;
+               fr_sbuff_t sbuff;
+               char buffer[1024];
+
+               sbuff = FR_SBUFF_OUT(buffer, sizeof(buffer));
+
+               /*
+                *      Squash the names down if necessary.
+                */
+               if (!RDEBUG_ENABLED3) {
+                       slen = fr_pair_print_name(&sbuff, NULL, &vp);
+                       if (slen <= 0) return;
+                       name = buffer;
+
+               } else {
+                       name = vp->da->name;
+               }
+
                switch (vp->vp_type) {
                case FR_TYPE_STRUCTURAL:
-                        RDEBUG2("%s = {", vp->da->name);
+                        RDEBUG2("%s = {", name);
                        RINDENT();
                        edit_debug_attr_list(request, &vp->vp_group, NULL);
                        REXDENT();
@@ -240,7 +259,8 @@ static void edit_debug_attr_vp(request_t *request, fr_pair_t *vp, map_t const *m
                        break;
 
                default:
-                       RDEBUG_ASSIGN(vp->da->name, vp->op, &vp->data);
+                       if (fr_pair_print_value_quoted(&sbuff, vp, T_DOUBLE_QUOTED_STRING) <= 0) return;
+                       RDEBUG2("%s", fr_sbuff_start(&sbuff));
                        break;
                }
        }
index e48a881d2c473a115f3f0b0498c09be24b15d843..02629f5a33f6a0f18e3f0f289858adb6f97ebec8 100644 (file)
@@ -109,7 +109,7 @@ done:
 }
 
 
-static void xlat_debug_attr_vp(request_t *request, fr_pair_t *vp);
+static void xlat_debug_attr_vp(request_t *request, fr_pair_t const *vp);
 
 static void xlat_debug_attr_list(request_t *request, fr_pair_list_t const *list)
 {
@@ -128,15 +128,30 @@ static xlat_arg_parser_t const xlat_pair_cursor_args[] = {
        XLAT_ARG_PARSER_TERMINATOR
 };
 
-static void xlat_debug_attr_vp(request_t *request, fr_pair_t *vp)
+static void xlat_debug_attr_vp(request_t *request, fr_pair_t const *vp)
 {
        fr_dict_vendor_t const          *vendor;
        fr_table_num_ordered_t const    *type;
        size_t                          i;
+       ssize_t                         slen;
+       char const                      *name;
+       char                            buffer[1024];
+
+       /*
+        *      Squash the names down if necessary.
+        */
+       if (!RDEBUG_ENABLED3) {
+               slen = fr_pair_print_name(&FR_SBUFF_OUT(buffer, sizeof(buffer)), NULL, &vp);
+               if (slen <= 0) return;
+               name = buffer;
+
+       } else {
+               name = vp->da->name;
+       }
 
        switch (vp->vp_type) {
        case FR_TYPE_STRUCTURAL:
-               RIDEBUG2("%s = {", vp->da->name);
+               RIDEBUG2("%s = {", name);
                RINDENT();
                xlat_debug_attr_list(request, &vp->vp_group);
                REXDENT();
@@ -144,7 +159,7 @@ static void xlat_debug_attr_vp(request_t *request, fr_pair_t *vp)
                break;
 
        default:
-               RIDEBUG2("%s = %pV", vp->da->name, &vp->data);
+               RIDEBUG2("%s = %pV", name, &vp->data);
        }
 
        if (!RDEBUG_ENABLED3) return;
@@ -194,9 +209,10 @@ static void xlat_debug_attr_vp(request_t *request, fr_pair_t *vp)
                 */
                if (!fr_type_is_leaf(type->value) || !fr_type_is_leaf(vp->vp_type)) goto next_type;
 
-               MEM(dst = fr_value_box_alloc_null(vp));
+               MEM(dst = fr_value_box_acopy(NULL, &vp->data));
+
                /* We expect some to fail */
-               if (fr_value_box_cast(dst, dst, type->value, NULL, &vp->data) < 0) {
+               if (fr_value_box_cast_in_place(dst, dst, type->value, NULL) < 0) {
                        goto next_type;
                }
 
index 3ce5d341baf6184a57be2fe42fd32763887cc48a..26828f14a5c68dec79e1edd84afdf0fa9fef2b03 100644 (file)
@@ -844,6 +844,8 @@ static inline fr_slen_t CC_HINT(nonnull(2,3))
                                            fr_pair_t const *vp, fr_token_t quote)
                SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(fr_pair_print_value_quoted, vp, quote)
 
+ssize_t                fr_pair_print_name(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pair_t const **vp_p);
+
 ssize_t                fr_pair_print(fr_sbuff_t *out, fr_dict_attr_t const *parent,
                              fr_pair_t const *vp) CC_HINT(nonnull(1,3));
 
@@ -861,11 +863,11 @@ static inline fr_slen_t CC_HINT(nonnull(2,4))
                SBUFF_OUT_TALLOC_FUNC_NO_LEN_DEF(fr_pair_print_secure, parent, vp)
 
 #define                fr_pair_list_log(_log, _lvl, _list) _fr_pair_list_log(_log, _lvl, NULL, _list, __FILE__, __LINE__)
-void           _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t *parent,
+void           _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t const *parent,
                                  fr_pair_list_t const *list, char const *file, int line) CC_HINT(nonnull(1,4));
 
 void           fr_pair_list_debug(FILE *fp, fr_pair_list_t const *list) CC_HINT(nonnull);
-void           _fr_pair_list_debug(FILE *fp, int lvl, fr_pair_t *parent, fr_pair_list_t const *list)
+void           _fr_pair_list_debug(FILE *fp, int lvl, fr_pair_t const *parent, fr_pair_list_t const *list)
                                    CC_HINT(nonnull(1, 4));
 void           fr_pair_debug(FILE *fp, fr_pair_t const *pair) CC_HINT(nonnull);
 
index 4ea295d59c56199d8a07293646040188d1299d90..bd1d2a2c4335bee45c4f5c5ea4c2e5a44012efc2 100644 (file)
@@ -497,6 +497,11 @@ redo:
                        goto error;
                }
 
+               /*
+                *      People can use this, but it doesn't mean anything.
+                */
+               if (op == T_OP_SET) op = T_OP_EQ;
+
        } else {
                /*
                 *      @todo - handle different operators ala v3?
index 4f87b19f28a8d74a5bbfdecbea70d7c3dd08e9c9..2cb91a1635502a1735bdcff5436d416c70f804bc 100644 (file)
@@ -21,7 +21,7 @@
  */
 #define fr_pair_reset_parent(parent) do {              \
        if (!parent) break;                             \
-       fr_assert(parent != vp->da);                    \
+       fr_assert((parent != vp->da) || (parent->type == FR_TYPE_GROUP)); \
        fr_assert(fr_type_is_structural(parent->type)); \
        if (parent->type == FR_TYPE_GROUP) {            \
                parent = fr_dict_attr_ref(parent);      \
@@ -133,7 +133,7 @@ static ssize_t fr_pair_print_value(fr_sbuff_t *out, fr_pair_t const *vp)
  *     - Length of data written to out.
  *     - value >= outlen on truncation.
  */
-static ssize_t fr_pair_print_name(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pair_t const **vp_p)
+ssize_t fr_pair_print_name(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pair_t const **vp_p)
 {
        char const              *token;
        fr_pair_t const         *vp = *vp_p;
@@ -341,34 +341,30 @@ ssize_t fr_pair_list_print(fr_sbuff_t *out, fr_dict_attr_t const *parent, fr_pai
        FR_SBUFF_SET_RETURN(out, &our_out);
 }
 
-static void fr_pair_list_log_sbuff(fr_log_t const *log, int lvl, fr_pair_t *parent, fr_pair_list_t const *list, char const *file, int line, fr_sbuff_t *sbuff)
+static void fr_pair_list_log_sbuff(fr_log_t const *log, int lvl, fr_pair_t const *parent, fr_pair_list_t const *list, char const *file, int line, fr_sbuff_t *sbuff)
 {
-       fr_dict_attr_t const *parent_da = NULL;
-
        fr_pair_list_foreach(list, vp) {
+               fr_pair_t const *child = vp;
+
                PAIR_VERIFY_WITH_LIST(list, vp);
 
                fr_sbuff_set_to_start(sbuff);
 
-               if (vp->vp_raw) (void) fr_sbuff_in_strcpy(sbuff, "raw.");
-
-               if (parent && (parent->vp_type != FR_TYPE_GROUP)) parent_da = parent->da;
-               if (fr_dict_attr_oid_print(sbuff, parent_da, vp->da, false) <= 0) return;
+               if (fr_pair_print_name(sbuff, parent ? parent->da : NULL, &child) <= 0) return;
 
                /*
                 *      Recursively print grouped attributes.
                 */
-               switch (vp->vp_type) {
+               switch (child->vp_type) {
                case FR_TYPE_STRUCTURAL:
                        fr_log(log, L_DBG, file, line, "%*s%*s {", lvl * 2, "",
                               (int) fr_sbuff_used(sbuff), fr_sbuff_start(sbuff));
-                       _fr_pair_list_log(log, lvl + 1, vp, &vp->vp_group, file, line);
+                       _fr_pair_list_log(log, lvl + 1, child, &child->vp_group, file, line);
                        fr_log(log, L_DBG, file, line, "%*s}", lvl * 2, "");
                        break;
 
                default:
-                       (void) fr_sbuff_in_strcpy(sbuff, " = ");
-                       if (fr_pair_print_value(sbuff, vp) < 0) break;
+                       if (fr_pair_print_value(sbuff, child) < 0) break;
 
                        fr_log(log, L_DBG, file, line, "%*s%*s", lvl * 2, "",
                               (int) fr_sbuff_used(sbuff), fr_sbuff_start(sbuff));
@@ -386,7 +382,7 @@ static void fr_pair_list_log_sbuff(fr_log_t const *log, int lvl, fr_pair_t *pare
  * @param[in] file     where the message originated
  * @param[in] line     where the message originated
  */
-void _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t *parent, fr_pair_list_t const *list, char const *file, int line)
+void _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t const *parent, fr_pair_list_t const *list, char const *file, int line)
 {
        fr_sbuff_t sbuff;
        char buffer[1024];
@@ -398,33 +394,29 @@ void _fr_pair_list_log(fr_log_t const *log, int lvl, fr_pair_t *parent, fr_pair_
        fr_pair_list_log_sbuff(log, lvl, parent, list, file, line, &sbuff);
 }
 
-static void fr_pair_list_debug_sbuff(FILE *fp, int lvl, fr_pair_t *parent, fr_pair_list_t const *list, fr_sbuff_t *sbuff)
+static void fr_pair_list_debug_sbuff(FILE *fp, int lvl, fr_pair_t const *parent, fr_pair_list_t const *list, fr_sbuff_t *sbuff)
 {
-       fr_dict_attr_t const *parent_da = NULL;
-
        fr_pair_list_foreach(list, vp) {
+               fr_pair_t const *child = vp;
+
                PAIR_VERIFY_WITH_LIST(list, vp);
 
                fr_sbuff_set_to_start(sbuff);
 
-               if (vp->vp_raw) (void) fr_sbuff_in_strcpy(sbuff, "raw.");
-
-               if (parent && (parent->vp_type != FR_TYPE_GROUP)) parent_da = parent->da;
-               if (fr_dict_attr_oid_print(sbuff, parent_da, vp->da, false) <= 0) return;
+               if (fr_pair_print_name(sbuff, parent ? parent->da : NULL, &child) <= 0) return;
 
                /*
                 *      Recursively print grouped attributes.
                 */
-               switch (vp->vp_type) {
+               switch (child->vp_type) {
                case FR_TYPE_STRUCTURAL:
                        fprintf(fp, "%*s%*s {\n", lvl * 2, "", (int) fr_sbuff_used(sbuff), fr_sbuff_start(sbuff));
-                       _fr_pair_list_debug(fp, lvl + 1, vp, &vp->vp_group);
+                       _fr_pair_list_debug(fp, lvl + 1, child, &child->vp_group);
                        fprintf(fp, "%*s}\n", lvl * 2, "");
                        break;
 
                default:
-                       (void) fr_sbuff_in_strcpy(sbuff, " = ");
-                       if (fr_value_box_print_quoted(sbuff, &vp->data, T_DOUBLE_QUOTED_STRING)< 0) break;
+                       if (fr_value_box_print_quoted(sbuff, &child->data, T_DOUBLE_QUOTED_STRING)< 0) break;
 
                        fprintf(fp, "%*s%*s\n", lvl * 2, "", (int) fr_sbuff_used(sbuff), fr_sbuff_start(sbuff));
                }
@@ -438,7 +430,7 @@ static void fr_pair_list_debug_sbuff(FILE *fp, int lvl, fr_pair_t *parent, fr_pa
  * @param[in] parent   parent attribute
  * @param[in] list     to print.
  */
-void _fr_pair_list_debug(FILE *fp, int lvl, fr_pair_t *parent, fr_pair_list_t const *list)
+void _fr_pair_list_debug(FILE *fp, int lvl, fr_pair_t const *parent, fr_pair_list_t const *list)
 {
        fr_sbuff_t sbuff;
        char buffer[1024];