BUG/MEDIUM: server: properly initialize PROXY v2 TLVs
authorDragan Dosen <ddosen@haproxy.com>
Wed, 26 Feb 2025 18:13:31 +0000 (19:13 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 13 Mar 2025 15:21:52 +0000 (16:21 +0100)
The PROXY v2 TLVs were not properly initialized when defined with
"set-proxy-v2-tlv-fmt" keyword, which could have caused a crash when
validating the configuration or malfunction (e.g. when used in
combination with "server-template" and/or "default-server").

The issue was introduced with commit 6f4bfed3a ("MINOR: server: Add
parser support for set-proxy-v2-tlv-fmt").

This should be backported up to 2.9.

(cherry picked from commit 6838fe43a320cf090892451ee907967666b626e5)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 77b48b2ae0dba907115c304ea78187a0f77e60c0)
Signed-off-by: Willy Tarreau <w@1wt.eu>

src/server.c

index 281db13..a82c4fd 100644 (file)
@@ -1682,6 +1682,7 @@ static int srv_parse_set_proxy_v2_tlv_fmt(char **args, int *cur_arg,
                goto fail;
        }
        srv_tlv->type = tlv_type;
+       lf_expr_init(&srv_tlv->fmt);
        srv_tlv->fmt_string = strdup(args[*cur_arg + 1]);
        if (unlikely(!srv_tlv->fmt_string)) {
                memprintf(err, "'%s' : failed to save format string for parsing", args[*cur_arg]);
@@ -2877,6 +2878,15 @@ void srv_settings_cpy(struct server *srv, const struct server *src, int srv_tmpl
                        break;
                }
                new_srv_tlv->type = srv_tlv->type;
+               lf_expr_init(&new_srv_tlv->fmt);
+               if (srv_tmpl) {
+                       if (new_srv_tlv->fmt_string && unlikely(!parse_logformat_string(new_srv_tlv->fmt_string,
+                           srv->proxy, &new_srv_tlv->fmt, 0, SMP_VAL_BE_SRV_CON, NULL))) {
+                               free(new_srv_tlv->fmt_string);
+                               free(new_srv_tlv);
+                               break;
+                       }
+               }
                LIST_APPEND(&srv->pp_tlvs, &new_srv_tlv->list);
        }
 }
@@ -3624,7 +3634,6 @@ static int _srv_parse_finalize(char **args, int cur_arg,
        }
 
        list_for_each_entry(srv_tlv, &srv->pp_tlvs, list) {
-               lf_expr_init(&srv_tlv->fmt);
                if (srv_tlv->fmt_string && unlikely(!parse_logformat_string(srv_tlv->fmt_string,
                        srv->proxy, &srv_tlv->fmt, 0, SMP_VAL_BE_SRV_CON, &errmsg))) {
                        if (errmsg) {