summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNirbhay Choubey <nirbhay@skysql.com>2014-07-09 11:04:28 -0400
committerNirbhay Choubey <nirbhay@skysql.com>2014-07-09 11:04:28 -0400
commit40bfd20180a392f0c2e56cc99fff9ab3bf3ef87f (patch)
tree87a341f119275a1592e8e1dc629392ea20e40303
parent04db5aeb097a9733ba31015f09198aea04067ee4 (diff)
downloadmariadb-git-40bfd20180a392f0c2e56cc99fff9ab3bf3ef87f.tar.gz
MDEV#6411 - Setting set @@global_wsrep_sst_auth=NULL
causes crash Fixed by properly handling the NULL values.
-rw-r--r--mysql-test/suite/wsrep/r/variables.result18
-rw-r--r--mysql-test/suite/wsrep/t/variables.test18
-rw-r--r--sql/mysqld.cc4
-rw-r--r--sql/wsrep_mysqld.cc7
-rw-r--r--sql/wsrep_mysqld.h2
-rw-r--r--sql/wsrep_sst.cc51
-rw-r--r--sql/wsrep_sst.h1
-rw-r--r--sql/wsrep_var.cc2
8 files changed, 79 insertions, 24 deletions
diff --git a/mysql-test/suite/wsrep/r/variables.result b/mysql-test/suite/wsrep/r/variables.result
index bfa371da3a7..bbd969c735a 100644
--- a/mysql-test/suite/wsrep/r/variables.result
+++ b/mysql-test/suite/wsrep/r/variables.result
@@ -11,6 +11,7 @@ SET SESSION wsrep_replicate_myisam= ON;
ERROR HY000: Variable 'wsrep_replicate_myisam' is a GLOBAL variable and should be set with SET GLOBAL
SET GLOBAL wsrep_replicate_myisam= ON;
SET GLOBAL wsrep_replicate_myisam= OFF;
+SET GLOBAL wsrep_provider=none;
#
# MDEV#6206: wsrep_slave_threads subtracts from max_connections
@@ -76,4 +77,21 @@ SET GLOBAL wsrep_slave_threads= @wsrep_slave_threads_saved;
SET GLOBAL wsrep_provider= none;
SET GLOBAL wsrep_cluster_address= '';
SET GLOBAL wsrep_provider_options= '';
+#
+# MDEV#6411: Setting set @@global.wsrep_sst_auth=NULL causes crash
+#
+SET @wsrep_sst_auth_saved= @@global.wsrep_sst_auth;
+SET @@global.wsrep_sst_auth= 'user:pass';
+SELECT @@global.wsrep_sst_auth;
+@@global.wsrep_sst_auth
+********
+SET @@global.wsrep_sst_auth= '';
+SELECT @@global.wsrep_sst_auth;
+@@global.wsrep_sst_auth
+
+SET @@global.wsrep_sst_auth= NULL;
+SELECT @@global.wsrep_sst_auth;
+@@global.wsrep_sst_auth
+NULL
+SET @@global.wsrep_sst_auth= @wsrep_sst_auth_saved;
# End of test.
diff --git a/mysql-test/suite/wsrep/t/variables.test b/mysql-test/suite/wsrep/t/variables.test
index 59d2aeccafd..a79a99bfecc 100644
--- a/mysql-test/suite/wsrep/t/variables.test
+++ b/mysql-test/suite/wsrep/t/variables.test
@@ -19,6 +19,7 @@ SET GLOBAL wsrep_replicate_myisam= ON;
# Reset it back.
SET GLOBAL wsrep_replicate_myisam= OFF;
+SET GLOBAL wsrep_provider=none;
--echo
--echo #
@@ -26,6 +27,11 @@ SET GLOBAL wsrep_replicate_myisam= OFF;
--echo #
call mtr.add_suppression("safe_mutex: Found wrong usage of mutex 'LOCK_wsrep_slave_threads' and 'LOCK_global_system_variables'");
call mtr.add_suppression("WSREP: Failed to get provider options");
+
+--disable_query_log
+eval SET GLOBAL wsrep_provider= '$WSREP_PROVIDER';
+--enable_query_log
+
--replace_regex /.*libgalera_smm.*/libgalera_smm.so/
SELECT @@global.wsrep_provider;
SELECT @@global.wsrep_slave_threads;
@@ -71,5 +77,17 @@ SET GLOBAL wsrep_provider= none;
SET GLOBAL wsrep_cluster_address= '';
SET GLOBAL wsrep_provider_options= '';
+--echo #
+--echo # MDEV#6411: Setting set @@global.wsrep_sst_auth=NULL causes crash
+--echo #
+SET @wsrep_sst_auth_saved= @@global.wsrep_sst_auth;
+SET @@global.wsrep_sst_auth= 'user:pass';
+SELECT @@global.wsrep_sst_auth;
+SET @@global.wsrep_sst_auth= '';
+SELECT @@global.wsrep_sst_auth;
+SET @@global.wsrep_sst_auth= NULL;
+SELECT @@global.wsrep_sst_auth;
+SET @@global.wsrep_sst_auth= @wsrep_sst_auth_saved;
+
--echo # End of test.
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index c008be9d5d3..888900565db 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1759,7 +1759,7 @@ static void __cdecl kill_server(int sig_ptr)
close_connections();
#ifdef WITH_WSREP
if (wsrep_inited == 1)
- wsrep_deinit();
+ wsrep_deinit(true);
#endif
if (sig != MYSQL_KILL_SIGNAL &&
sig != 0)
@@ -1871,7 +1871,7 @@ extern "C" void unireg_abort(int exit_code)
/* In bootstrap mode we deinitialize wsrep here. */
if (opt_bootstrap && wsrep_inited)
- wsrep_deinit();
+ wsrep_deinit(true);
}
#endif // WITH_WSREP
diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc
index 1d869ab84c5..a0ea67c51ab 100644
--- a/sql/wsrep_mysqld.cc
+++ b/sql/wsrep_mysqld.cc
@@ -696,7 +696,7 @@ void wsrep_init_startup (bool first)
}
-void wsrep_deinit()
+void wsrep_deinit(bool free_options)
{
DBUG_ASSERT(wsrep_inited == 1);
wsrep_unload(wsrep);
@@ -708,6 +708,11 @@ void wsrep_deinit()
delete wsrep_format_desc;
wsrep_format_desc= NULL;
wsrep_inited= 0;
+
+ if (free_options)
+ {
+ wsrep_sst_auth_free();
+ }
}
void wsrep_recover()
diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h
index 7939bf55684..8e5b14f37a0 100644
--- a/sql/wsrep_mysqld.h
+++ b/sql/wsrep_mysqld.h
@@ -124,7 +124,7 @@ void wsrep_free_status(THD *thd);
void wsrep_filter_new_cluster (int* argc, char* argv[]);
int wsrep_init();
-void wsrep_deinit();
+void wsrep_deinit(bool free_options);
void wsrep_recover();
bool wsrep_before_SE(); // initialize wsrep before storage
// engines (true) or after (false)
diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc
index 1b57b63131c..be9efa86873 100644
--- a/sql/wsrep_sst.cc
+++ b/sql/wsrep_sst.cc
@@ -120,31 +120,44 @@ bool wsrep_sst_auth_check (sys_var *self, THD* thd, set_var* var)
{
return 0;
}
+
static bool sst_auth_real_set (const char* value)
{
- const char* v = strdup (value);
+ const char* v= NULL;
- if (v)
- {
- if (sst_auth_real) free (const_cast<char*>(sst_auth_real));
- sst_auth_real = v;
+ if (value)
+ {
+ v= my_strdup(value, MYF(0));
+ }
+ else // its NULL
+ {
+ wsrep_sst_auth_free();
+ return 0;
+ }
- if (strlen(sst_auth_real))
- {
- if (wsrep_sst_auth)
- {
- my_free ((void*)wsrep_sst_auth);
- wsrep_sst_auth = my_strdup(WSREP_SST_AUTH_MASK, MYF(0));
- //strncpy (wsrep_sst_auth, WSREP_SST_AUTH_MASK,
- // sizeof(wsrep_sst_auth) - 1);
- }
- else
- wsrep_sst_auth = my_strdup (WSREP_SST_AUTH_MASK, MYF(0));
- }
- return 0;
+ if (v)
+ {
+ // set sst_auth_real
+ if (sst_auth_real) { my_free((void *) sst_auth_real); }
+ sst_auth_real = v;
+
+ // mask wsrep_sst_auth
+ if (strlen(sst_auth_real))
+ {
+ if (wsrep_sst_auth) { my_free((void*) wsrep_sst_auth); }
+ wsrep_sst_auth= my_strdup(WSREP_SST_AUTH_MASK, MYF(0));
}
+ return 0;
+ }
+ return 1;
+}
- return 1;
+void wsrep_sst_auth_free()
+{
+ if (wsrep_sst_auth) { my_free((void *) wsrep_sst_auth); }
+ if (sst_auth_real) { my_free((void *) sst_auth_real); }
+ wsrep_sst_auth= NULL;
+ sst_auth_real= NULL;
}
bool wsrep_sst_auth_update (sys_var *self, THD* thd, enum_var_type type)
diff --git a/sql/wsrep_sst.h b/sql/wsrep_sst.h
index b7f0e26f226..dc7789f5a4e 100644
--- a/sql/wsrep_sst.h
+++ b/sql/wsrep_sst.h
@@ -31,6 +31,7 @@ extern void wsrep_sst_grab();
extern bool wsrep_sst_wait();
/*! Signals wsrep that initialization is complete, writesets can be applied */
extern void wsrep_sst_continue();
+extern void wsrep_sst_auth_free();
extern void wsrep_SE_init_grab(); /*! grab init critical section */
extern void wsrep_SE_init_wait(); /*! wait for SE init to complete */
diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc
index 8aa2c9f321b..54d0b1cdfe6 100644
--- a/sql/wsrep_var.cc
+++ b/sql/wsrep_var.cc
@@ -239,7 +239,7 @@ bool wsrep_provider_update (sys_var *self, THD* thd, enum_var_type type)
mysql_mutex_lock(&LOCK_global_system_variables);
if (wsrep_inited == 1)
- wsrep_deinit();
+ wsrep_deinit(false);
char* tmp= strdup(wsrep_provider); // wsrep_init() rewrites provider
//when fails