]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
allow the caller to add extra bits after a client definition
authorAlan T. DeKok <aland@freeradius.org>
Wed, 1 Mar 2023 22:09:56 +0000 (17:09 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 1 Mar 2023 22:29:39 +0000 (17:29 -0500)
src/bin/unit_test_module.c
src/lib/server/client.c
src/lib/server/client.h
src/modules/rlm_couchbase/mod.c

index a5d6c875bf7c835d1a110afebd49d9085f2cbc83..f8e5e00e1e8fa9b0e863bf681ae6715b27094e73 100644 (file)
@@ -113,7 +113,7 @@ static fr_client_t *client_alloc(TALLOC_CTX *ctx, char const *ip, char const *na
        MEM(cf_pair_alloc(cs, "groups", "bar", T_OP_EQ, T_BARE_WORD, T_DOUBLE_QUOTED_STRING));
        MEM(cf_pair_alloc(cs, "groups", "baz", T_OP_EQ, T_BARE_WORD, T_DOUBLE_QUOTED_STRING));
 
-       client = client_afrom_cs(ctx, cs, NULL);
+       client = client_afrom_cs(ctx, cs, NULL, 0);
        if (!client) {
                PERROR("Failed creating test client");
                fr_assert(0);
index 2d5ae9213dcddaa6c94cb06ec925b3ede7a3d034..b81d840e8ee5db13fd6a44918279e6f3f490c939 100644 (file)
@@ -440,19 +440,19 @@ static const CONF_PARSER client_config[] = {
 
        { FR_CONF_POINTER("src_ipaddr", FR_TYPE_STRING, &cl_srcipaddr) },
 
-       { FR_CONF_OFFSET("require_message_authenticator", FR_TYPE_BOOL, fr_client_t, message_authenticator), .dflt = "no" },
-
-       { FR_CONF_OFFSET("dedup_authenticator", FR_TYPE_BOOL, fr_client_t, dedup_authenticator), .dflt = "no" },
-
        { FR_CONF_OFFSET("secret", FR_TYPE_STRING | FR_TYPE_SECRET, fr_client_t, secret) },
        { FR_CONF_OFFSET("shortname", FR_TYPE_STRING, fr_client_t, shortname) },
 
        { FR_CONF_OFFSET("nas_type", FR_TYPE_STRING, fr_client_t, nas_type) },
 
-       { FR_CONF_OFFSET("response_window", FR_TYPE_TIME_DELTA, fr_client_t, response_window) },
-
        { FR_CONF_OFFSET("track_connections", FR_TYPE_BOOL, fr_client_t, use_connected) },
 
+       { FR_CONF_OFFSET("require_message_authenticator", FR_TYPE_BOOL, fr_client_t, message_authenticator), .dflt = "no" },
+
+       { FR_CONF_OFFSET("dedup_authenticator", FR_TYPE_BOOL, fr_client_t, dedup_authenticator), .dflt = "no" },
+
+       { FR_CONF_OFFSET("response_window", FR_TYPE_TIME_DELTA, fr_client_t, response_window) },
+
        { FR_CONF_POINTER("proto", FR_TYPE_STRING, &hs_proto) },
        { FR_CONF_POINTER("limit", FR_TYPE_SUBSECTION, NULL), .subcs = (void const *) limit_config },
 
@@ -549,7 +549,7 @@ fr_client_list_t *client_list_parse_section(CONF_SECTION *section, int proto, TL
                }
 
 
-               c = client_afrom_cs(cs, cs, server_cs);
+               c = client_afrom_cs(cs, cs, server_cs, 0);
                if (!c) {
                error:
                        client_free(c);
@@ -697,7 +697,7 @@ int client_map_section(CONF_SECTION *out, CONF_SECTION const *map, client_value_
  * @param server_cs The virtual server that this client belongs to.
  * @return new fr_client_t struct.
  */
-fr_client_t *client_afrom_cs(TALLOC_CTX *ctx, CONF_SECTION *cs, CONF_SECTION *server_cs)
+fr_client_t *client_afrom_cs(TALLOC_CTX *ctx, CONF_SECTION *cs, CONF_SECTION *server_cs, size_t extra)
 {
        fr_client_t     *c;
        char const      *name2;
@@ -712,7 +712,18 @@ fr_client_t *client_afrom_cs(TALLOC_CTX *ctx, CONF_SECTION *cs, CONF_SECTION *se
        /*
         *      The size is fine.. Let's create the buffer
         */
-       c = talloc_zero(ctx, fr_client_t);
+       if (!extra) {
+               c = talloc_zero(ctx, fr_client_t);
+               if (!c) return NULL;
+       } else {
+               fr_assert(extra > sizeof(fr_client_t));
+
+               c = (fr_client_t *) talloc_zero_array(ctx, uint8_t, extra);
+               if (!c) return NULL;
+
+               talloc_set_name_const(c, "fr_client_t");
+       }
+
        c->cs = cs;
 
        memset(&cl_ipaddr, 0, sizeof(cl_ipaddr));
@@ -992,7 +1003,7 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request)
         *      @todo - allow for setting a DIFFERENT virtual server,
         *      src IP, protocol, etc.  This should all be in TLVs..
         */
-       c = client_afrom_cs(cs, cs, unlang_call_current(request));
+       c = client_afrom_cs(cs, cs, unlang_call_current(request), 0);
        if (!c) {
        error:
                talloc_free(cs);
@@ -1036,7 +1047,7 @@ fr_client_t *client_read(char const *filename, CONF_SECTION *server_cs, bool che
                return NULL;
        }
 
-       c = client_afrom_cs(cs, cs, server_cs);
+       c = client_afrom_cs(cs, cs, server_cs, 0);
        if (!c) return NULL;
        talloc_steal(cs, c);
 
index 16429641a8ac4ddb8bab76d6f097530525898afe..e07ed4bd8df39839b4811b97fef620cc2e3a8b0a 100644 (file)
@@ -132,7 +132,7 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request);
 
 int            client_map_section(CONF_SECTION *out, CONF_SECTION const *map, client_value_cb_t func, void *data);
 
-fr_client_t    *client_afrom_cs(TALLOC_CTX *ctx, CONF_SECTION *cs, CONF_SECTION *server_cs);
+fr_client_t    *client_afrom_cs(TALLOC_CTX *ctx, CONF_SECTION *cs, CONF_SECTION *server_cs, size_t extra);
 
 fr_client_t    *client_find(fr_client_list_t const *clients, fr_ipaddr_t const *ipaddr, int proto);
 
index 44b80f42f09cbd2d3625e2d13b73e5939f9b2f02..f75d3144b7a5a19ad3c63c8c2cb74cb3e051e937 100644 (file)
@@ -867,7 +867,7 @@ int mod_load_client_documents(rlm_couchbase_t *inst, CONF_SECTION *tmpl, CONF_SE
                /*
                 * @todo These should be parented from something.
                 */
-               c = client_afrom_cs(NULL, client, false);
+               c = client_afrom_cs(NULL, client, false, 0);
                if (!c) {
                        ERROR("failed to allocate client");
                        /* free config setion */