]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add fr_lua_parent_build
authorNick Porter <nick@portercomputing.co.uk>
Thu, 1 May 2025 12:33:58 +0000 (13:33 +0100)
committerNick Porter <nick@portercomputing.co.uk>
Fri, 2 May 2025 08:59:29 +0000 (09:59 +0100)
To build out parent attributes when setting a leaf whose parents don't
exist

src/modules/rlm_lua/lua.c

index 2b49a438741b7713ec3cd7c7bbdea06e4fdd33ca..dd90c0f2ee75dae8cd5a6264ae9c02c2b480d730 100644 (file)
@@ -313,6 +313,27 @@ static int fr_lua_unmarshall(TALLOC_CTX *ctx, fr_value_box_t *out_vb, request_t
        return 0;
 }
 
+/** Build parent structural pairs needed when a leaf node is set
+ *
+ */
+static int fr_lua_pair_parent_build(request_t *request, fr_lua_pair_t *pair_data)
+{
+       if (!pair_data->parent->vp) {
+               if (fr_lua_pair_parent_build(request, pair_data->parent) < 0) return -1;
+       }
+       if (pair_data->idx > 1) {
+               unsigned int count = fr_pair_count_by_da(&pair_data->parent->vp->vp_group, pair_data->da);
+               if (count < (pair_data->idx - 1)) {
+                       RERROR("Attempt to set instance %d when only %d exist", pair_data->idx, count);
+                       return -1;
+               }
+       }
+
+       if (fr_pair_append_by_da(pair_data->parent->vp, &pair_data->vp,
+                                &pair_data->parent->vp->vp_group, pair_data->da) < 0) return -1;
+       return 0;
+}
+
 /** Set an instance of an attribute
  *
  * @note Should only be present in the Lua environment as a closure.