From: Nick Porter Date: Thu, 1 May 2025 12:33:58 +0000 (+0100) Subject: Add fr_lua_parent_build X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6d84d8aa43036b35f7eff4c6dae77b51216e13ab;p=thirdparty%2Ffreeradius-server.git Add fr_lua_parent_build To build out parent attributes when setting a leaf whose parents don't exist --- diff --git a/src/modules/rlm_lua/lua.c b/src/modules/rlm_lua/lua.c index 2b49a438741..dd90c0f2ee7 100644 --- a/src/modules/rlm_lua/lua.c +++ b/src/modules/rlm_lua/lua.c @@ -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.