From 832743f8f7c4978e05d3d33b88b61c89bac3dff1 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Sun, 14 Sep 2025 17:12:34 +0200 Subject: [PATCH] fix a memory leak in sysvars GET_STR_ALLOC options are allocated by my_getopt in init_one_value(). but maria-backup never calls handle_option() for them at all, so Sys_var_charptr_base needs a protection for partially-initialized variables. followup for f33367f2ab19 --- sql/sys_vars.inl | 10 +++------- sql/wsrep_var.cc | 9 --------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/sql/sys_vars.inl b/sql/sys_vars.inl index 0094751ad91..20155acba8a 100644 --- a/sql/sys_vars.inl +++ b/sql/sys_vars.inl @@ -520,14 +520,11 @@ public: (think of an exit because of an error right after my_getopt) */ option.var_type|= (flags & ALLOCATED) ? GET_STR_ALLOC : GET_STR; - if (def_val && (flags & ALLOCATED)) - global_var(const char*)= my_strdup(PSI_INSTRUMENT_ME, def_val, MYF(0)); - else - global_var(const char*)= def_val; + global_var(const char*)= def_val; } void cleanup() override { - if (flags & ALLOCATED) + if (flags & ALLOCATED && global_var(intptr) != (intptr)option.def_value) { my_free(global_var(char*)); global_var(char *)= NULL; @@ -583,8 +580,7 @@ public: } void global_update_finish(char *new_val) { - if (flags & ALLOCATED) - my_free(global_var(char*)); + cleanup(); flags|= ALLOCATED; global_var(char*)= new_val; } diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc index 7fdaedba281..c21fdf882f7 100644 --- a/sql/wsrep_var.cc +++ b/sql/wsrep_var.cc @@ -33,15 +33,6 @@ ulong wsrep_reject_queries; int wsrep_init_vars() { - my_free((char*) wsrep_provider); - my_free((char*) wsrep_provider_options); - my_free((char*) wsrep_cluster_address); - my_free((char*) wsrep_cluster_name); - my_free((char*) wsrep_node_name); - my_free((char*) wsrep_node_address); - my_free((char*) wsrep_node_incoming_address); - my_free((char*) wsrep_start_position); - wsrep_provider = my_strdup(PSI_INSTRUMENT_ME, WSREP_NONE, MYF(MY_WME)); wsrep_provider_options= my_strdup(PSI_INSTRUMENT_ME, "", MYF(MY_WME)); wsrep_cluster_address = my_strdup(PSI_INSTRUMENT_ME, "", MYF(MY_WME));