]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
:= should just replace the existing vp instead of building out extents
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 3 Nov 2021 21:40:52 +0000 (17:40 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 3 Nov 2021 21:40:52 +0000 (17:40 -0400)
src/lib/server/map.c
src/lib/server/tmpl_eval.c

index c366326f0d2bb3e34ec2a28e2d0445f4654db897..38cf15f328a0cd22e2462e6840130d76f3637056 100644 (file)
@@ -1768,6 +1768,16 @@ int map_to_request(request_t *request, map_t const *map, radius_map_getvalue_t f
                fr_dlist_head_t         interior;
                fr_pair_t               *src_vp;
 
+               if (dst) {
+                       fr_pair_t *old;
+
+                       DEBUG_OVERWRITE(dst, src_vp);
+                       old = fr_dcursor_replace(&dst_list, fr_pair_copy(talloc_parent(dst), src_vp));
+                       talloc_free(old);       /* Remove the old pair */
+
+                       goto op_set_done;
+               }
+
                fr_dlist_talloc_init(&leaf, tmpl_attr_extent_t, entry);
                fr_dlist_talloc_init(&interior, tmpl_attr_extent_t, entry);
 
@@ -1790,15 +1800,9 @@ int map_to_request(request_t *request, map_t const *map, radius_map_getvalue_t f
                        goto op_set_error;
                } else {
                        extent = fr_dlist_head(&leaf);
-                       if (dst) {
-                               DEBUG_OVERWRITE(dst, src_vp);
-                               dst = fr_dcursor_replace(extent->list, fr_pair_copy(extent->list_ctx, src_vp));
-                               talloc_free(dst);
-                       } else {
-                               fr_pair_append(extent->list, fr_pair_copy(extent->list_ctx, src_vp));
-                       }
+                       fr_pair_append(extent->list, fr_pair_copy(extent->list_ctx, src_vp));
                }
-
+       op_set_done:
                /* Free any we didn't insert */
                fr_pair_list_free(&src_list);
                fr_assert(fr_dlist_num_elements(&interior) == 0);
index 0c5a63ff7c2fda3648c4e99f9c790001dc820fa6..7130ccddde78c54671477474d4396614012362f2 100644 (file)
@@ -1387,6 +1387,7 @@ int tmpl_find_or_add_vp(fr_pair_t **out, request_t *request, tmpl_t const *vpt)
  * @param[in] vpt              specifying the #fr_pair_t type to retrieve or create.
  *                             Must be #TMPL_TYPE_ATTR.
  * @return
+ *     - 1 on success a pair was created.
  *     - 0 on success a pair was found.
  *     - -1 if a new #fr_pair_t couldn't be found or created.
  *     - -2 if list could not be found (doesn't exist in current #request_t).
@@ -1451,7 +1452,7 @@ int tmpl_extents_find(TALLOC_CTX *ctx,
        if (vpt->type == TMPL_TYPE_LIST) {
        do_list:
                if (leaf) EXTENT_ADD(leaf, NULL, list_ctx, list_head);
-               goto done;
+               return 0;
        }
 
        /*
@@ -1538,22 +1539,10 @@ int tmpl_extents_find(TALLOC_CTX *ctx,
                        continue;
 
                default:
-                       if (leaf) EXTENT_ADD(leaf, NULL, list_ctx, list_head);
                        break;
                }
        }
 
-done:
-       /*
-        *      If we were asked to provide interior
-        *      and leaf lists, and there's no result
-        *      in either, then that's a logic error.
-        *
-        *      We either have an attribute or will
-        *      need to build out pairs to it.
-        */
-       fr_assert(!leaf || !interior || (fr_dlist_num_elements(leaf) > 0) || (fr_dlist_num_elements(interior) > 0));
-
        return 0;
 }