From: Willy Tarreau Date: Mon, 13 Nov 2023 07:46:51 +0000 (+0100) Subject: MINOR: server: always initialize pp_tlvs for default servers X-Git-Tag: v2.9-dev10~93 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=79aa63823;p=thirdparty%2Fhaproxy.git MINOR: server: always initialize pp_tlvs for default servers In commit 6f4bfed3a ("MINOR: server: Add parser support for set-proxy-v2-tlv-fmt") a suspicious check for a NULL srv_tlv was placed in the list_for_each_entry(), that should not be needed. In practice, it's caused by the list head not being initialized, hence the first element is NULL, as shown by Alexander's reproducer below which crashes if the test in the loop is removed: backend dummy default-server send-proxy-v2 set-proxy-v2-tlv-fmt(0xE1) %[fc_pp_tlv(0xE1)] server dummy_server 127.0.0.1:2319 The right place to initialize this field is proxy_preset_defaults(). We'd really need a function to initialize a server :-/ The check in the loop was removed. No backport is needed. --- diff --git a/src/proxy.c b/src/proxy.c index 7ff0871903..544c22f826 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -1469,6 +1469,7 @@ void proxy_preset_defaults(struct proxy *defproxy) defproxy->defsrv.onerror = DEF_HANA_ONERR; defproxy->defsrv.consecutive_errors_limit = DEF_HANA_ERRLIMIT; defproxy->defsrv.uweight = defproxy->defsrv.iweight = 1; + LIST_INIT(&defproxy->defsrv.pp_tlvs); defproxy->email_alert.level = LOG_ALERT; defproxy->load_server_state_from_file = PR_SRV_STATE_FILE_UNSPEC; diff --git a/src/server.c b/src/server.c index ef41a109a2..8988cb8be9 100644 --- a/src/server.c +++ b/src/server.c @@ -2514,8 +2514,6 @@ void srv_settings_cpy(struct server *srv, const struct server *src, int srv_tmpl LIST_INIT(&srv->pp_tlvs); list_for_each_entry(srv_tlv, &src->pp_tlvs, list) { - if (srv_tlv == NULL) - break; new_srv_tlv = malloc(sizeof(*new_srv_tlv)); if (unlikely(!new_srv_tlv)) { break;