summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@galeracluster.com>2023-05-03 08:29:38 +0300
committerJulius Goryavsky <julius.goryavsky@mariadb.com>2023-05-12 02:48:16 +0200
commitf102b595e8a65d910e34ea943eb562dc16a4256c (patch)
tree85fee40d0d9ff3f63ee8ebcdb37497501d4e58d6
parent7d55eb00f357e876fc81631919dd7f7defaf5bec (diff)
downloadmariadb-git-bb-10.4-MDEV-28433-galera.tar.gz
MDEV-28433 : Server crashes when wsrep_sst_donor and wsrep_cluster_address set to NULLbb-10.4-MDEV-28433-galera
Do not allow setting wsrep_sst_donor as NULL as it is incorrect value. User can use value '' (default) that represents same as NULL. Setting wsrep_cluster_address to NULL is already handled correctly. Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
-rw-r--r--mysql-test/suite/galera/r/mdev-28433.result25
-rw-r--r--mysql-test/suite/galera/t/mdev-28433.test35
-rw-r--r--mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result11
-rw-r--r--mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test5
-rw-r--r--sql/wsrep_sst.cc9
5 files changed, 81 insertions, 4 deletions
diff --git a/mysql-test/suite/galera/r/mdev-28433.result b/mysql-test/suite/galera/r/mdev-28433.result
new file mode 100644
index 00000000000..c2dde6481f4
--- /dev/null
+++ b/mysql-test/suite/galera/r/mdev-28433.result
@@ -0,0 +1,25 @@
+connection node_2;
+connection node_1;
+connection node_1;
+connection node_2;
+connection node_2;
+SET @@global.wsrep_sst_donor = NULL;
+ERROR 42000: Variable 'wsrep_sst_donor' can't be set to the value of 'NULL'
+SET @@global.wsrep_cluster_address='NULL';
+SET SESSION wsrep_sync_wait=0;
+SELECT @@wsrep_sst_donor;
+@@wsrep_sst_donor
+
+SELECT @@wsrep_cluster_address;
+@@wsrep_cluster_address
+NULL
+SHOW STATUS LIKE 'wsrep_ready';
+Variable_name Value
+wsrep_ready OFF
+SHOW STATUS LIKE 'wsrep_cluster_status';
+Variable_name Value
+wsrep_cluster_status Disconnected
+call mtr.add_suppression("WSREP: .*Invalid backend URI.*");
+call mtr.add_suppression("WSREP: gcs connect failed: Invalid argument");
+disconnect node_2;
+disconnect node_1;
diff --git a/mysql-test/suite/galera/t/mdev-28433.test b/mysql-test/suite/galera/t/mdev-28433.test
new file mode 100644
index 00000000000..ddee3618fee
--- /dev/null
+++ b/mysql-test/suite/galera/t/mdev-28433.test
@@ -0,0 +1,35 @@
+--source include/galera_cluster.inc
+
+# Save original auto_increment_offset values.
+--let $node_1=node_1
+--let $node_2=node_2
+--source include/auto_increment_offset_save.inc
+
+--connection node_2
+--let $wsrep_cluster_address_saved = `SELECT @@global.wsrep_cluster_address`
+
+--error ER_WRONG_VALUE_FOR_VAR
+SET @@global.wsrep_sst_donor = NULL;
+--let $wsrep_cluster_address_orig = `SELECT @@wsrep_cluster_address`
+SET @@global.wsrep_cluster_address='NULL';
+SET SESSION wsrep_sync_wait=0;
+SELECT @@wsrep_sst_donor;
+SELECT @@wsrep_cluster_address;
+# Must return 'OFF'
+SHOW STATUS LIKE 'wsrep_ready';
+
+# Must return 'Disconnected'
+SHOW STATUS LIKE 'wsrep_cluster_status';
+
+--disable_query_log
+--eval SET @@global.wsrep_cluster_address = '$wsrep_cluster_address_orig'
+--enable_query_log
+--source include/wait_until_connected_again.inc
+--source include/galera_wait_ready.inc
+call mtr.add_suppression("WSREP: .*Invalid backend URI.*");
+call mtr.add_suppression("WSREP: gcs connect failed: Invalid argument");
+
+# Restore original auto_increment_offset values.
+--source include/auto_increment_offset_restore.inc
+
+--source include/galera_end.inc
diff --git a/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result b/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result
index 3d4fc24df7f..dbe4cc23bf9 100644
--- a/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result
+++ b/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result
@@ -33,17 +33,22 @@ SET @@global.wsrep_sst_donor=default;
SELECT @@global.wsrep_sst_donor;
@@global.wsrep_sst_donor
-SET @@global.wsrep_sst_donor=NULL;
+SET @@global.wsrep_sst_donor='';
SELECT @@global.wsrep_sst_donor;
@@global.wsrep_sst_donor
-NULL
+
# invalid values
SET @@global.wsrep_sst_donor=1;
ERROR 42000: Incorrect argument type to variable 'wsrep_sst_donor'
SELECT @@global.wsrep_sst_donor;
@@global.wsrep_sst_donor
-NULL
+
+SET @@global.wsrep_sst_donor=NULL;
+ERROR 42000: Variable 'wsrep_sst_donor' can't be set to the value of 'NULL'
+SELECT @@global.wsrep_sst_donor;
+@@global.wsrep_sst_donor
+
# restore the initial value
SET @@global.wsrep_sst_donor = @wsrep_sst_donor_global_saved;
diff --git a/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test b/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test
index 7d3d6598557..c4b32bb8af6 100644
--- a/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test
+++ b/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test
@@ -27,7 +27,7 @@ SET @@global.wsrep_sst_donor='hyphenated-donor-name';
SELECT @@global.wsrep_sst_donor;
SET @@global.wsrep_sst_donor=default;
SELECT @@global.wsrep_sst_donor;
-SET @@global.wsrep_sst_donor=NULL;
+SET @@global.wsrep_sst_donor='';
SELECT @@global.wsrep_sst_donor;
--echo
@@ -35,6 +35,9 @@ SELECT @@global.wsrep_sst_donor;
--error ER_WRONG_TYPE_FOR_VAR
SET @@global.wsrep_sst_donor=1;
SELECT @@global.wsrep_sst_donor;
+--error ER_WRONG_VALUE_FOR_VAR
+SET @@global.wsrep_sst_donor=NULL;
+SELECT @@global.wsrep_sst_donor;
--echo
--echo # restore the initial value
diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc
index 1fb1d6890e2..a0540744c96 100644
--- a/sql/wsrep_sst.cc
+++ b/sql/wsrep_sst.cc
@@ -299,6 +299,15 @@ void wsrep_sst_auth_init ()
bool wsrep_sst_donor_check (sys_var *self, THD* thd, set_var* var)
{
+ if ((! var->save_result.string_value.str) ||
+ (var->save_result.string_value.length > (FN_REFLEN -1))) // safety
+ {
+ my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var->var->name.str,
+ var->save_result.string_value.str ?
+ var->save_result.string_value.str : "NULL");
+ return 1;
+ }
+
return 0;
}