From: Arran Cudbard-Bell Date: Sun, 3 Nov 2024 08:03:29 +0000 (+0200) Subject: Simplify dynamic client generation code X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=70177944dc88ede24f809f1044e46c49cfb99b3b;p=thirdparty%2Ffreeradius-server.git Simplify dynamic client generation code --- diff --git a/src/lib/server/client.c b/src/lib/server/client.c index e1595f678c2..9474280fda8 100644 --- a/src/lib/server/client.c +++ b/src/lib/server/client.c @@ -931,14 +931,12 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request) { static int cnt; CONF_SECTION *cs; - char buffer[256]; fr_client_t *c; fr_sbuff_t *tmp; - fr_token_t v_token = T_BARE_WORD; if (!request) return NULL; - FR_SBUFF_TALLOC_THREAD_LOCAL(&tmp, 1024, SIZE_MAX); + FR_SBUFF_TALLOC_THREAD_LOCAL(&tmp, 128, SIZE_MAX); if (unlikely(fr_sbuff_in_sprintf(tmp, "dynamic_%i_", cnt++) <= 0)) { name_error: @@ -948,7 +946,7 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request) if (unlikely(fr_value_box_print(tmp, fr_box_ipaddr(request->packet->socket.inet.src_ipaddr), NULL) <= 0)) goto name_error; fr_sbuff_set_to_start(tmp); - cs = cf_section_alloc(ctx, NULL, "client", buffer); + cs = cf_section_alloc(ctx, NULL, "client", fr_sbuff_current(tmp)); RDEBUG2("Converting &control.FreeRADIUS-Client-* to client {...} section"); RINDENT(); @@ -957,29 +955,34 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request) CONF_PAIR *cp = NULL; char const *value; char const *attr; + fr_token_t v_token = T_BARE_WORD; if (!fr_dict_attr_is_top_level(vp->da)) continue; switch (vp->da->attr) { case FR_FREERADIUS_CLIENT_IP_ADDRESS: attr = "ipv4addr"; - value = fr_inet_ntop(buffer, sizeof(buffer), &vp->vp_ip); + vb_to_str: + if (unlikely(fr_pair_print_value_quoted(tmp, vp, T_BARE_WORD) < 0)) { + RERROR("Failed to convert %pP to string", vp); + error: + talloc_free(cs); + return NULL; + } + value = fr_sbuff_start(tmp); break; case FR_FREERADIUS_CLIENT_IP_PREFIX: attr = "ipv4addr"; - value = fr_inet_ntop_prefix(buffer, sizeof(buffer), &vp->vp_ip); - break; + goto vb_to_str; case FR_FREERADIUS_CLIENT_IPV6_ADDRESS: attr = "ipv6addr"; - value = fr_inet_ntop(buffer, sizeof(buffer), &vp->vp_ip); - break; + goto vb_to_str; case FR_FREERADIUS_CLIENT_IPV6_PREFIX: attr = "ipv6addr"; - value = fr_inet_ntop_prefix(buffer, sizeof(buffer), &vp->vp_ip); - break; + goto vb_to_str; case FR_FREERADIUS_CLIENT_SECRET: attr = "secret"; @@ -998,59 +1001,19 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request) case FR_FREERADIUS_CLIENT_SRC_IP_ADDRESS: attr = "src_ipaddr"; - value = fr_inet_ntop(buffer, sizeof(buffer), &vp->vp_ip); - break; + goto vb_to_str; case FR_FREERADIUS_CLIENT_REQUIRE_MA: attr = "require_message_authenticator"; - switch(vp->vp_uint8) { - case FR_FREERADIUS_CLIENT_REQUIRE_MA_VALUE_NO: - value = "no"; - break; - - case FR_FREERADIUS_CLIENT_REQUIRE_MA_VALUE_AUTO: - value = "auto"; - break; - - case FR_FREERADIUS_CLIENT_REQUIRE_MA_VALUE_YES: - value = "yes"; - break; - - default: - RERROR("Invalid value for FreeRADIUS-Client-Require-MA"); - goto error; - } - break; + goto vb_to_str; case FR_FREERADIUS_CLIENT_LIMIT_PROXY_STATE: attr = "limit_proxy_state"; - switch(vp->vp_uint8) { - case FR_FREERADIUS_CLIENT_LIMIT_PROXY_STATE_VALUE_NO: - value = "no"; - break; - - case FR_FREERADIUS_CLIENT_LIMIT_PROXY_STATE_VALUE_AUTO: - value = "auto"; - break; - - case FR_FREERADIUS_CLIENT_LIMIT_PROXY_STATE_VALUE_YES: - value = "yes"; - break; - - default: - RERROR("Invalid value for FreeRADIUS-Client-Limit-Proxy-State"); - goto error; - } - break; + goto vb_to_str; case FR_FREERADIUS_CLIENT_TRACK_CONNECTIONS: attr = "track_connections"; - if (vp->vp_bool) { - value = "true"; - } else { - value = "false"; - } - break; + goto vb_to_str; default: RDEBUG2("Adding custom attribute %pP", vp); @@ -1077,11 +1040,7 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request) * src IP, protocol, etc. This should all be in TLVs.. */ c = client_afrom_cs(cs, cs, unlang_call_current(request), 0); - if (!c) { - error: - talloc_free(cs); - return NULL; - } + if (!c) goto error; return c; }