summaryrefslogtreecommitdiffstats
path: root/sql/wsrep_client_service.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/wsrep_client_service.cc')
-rw-r--r--sql/wsrep_client_service.cc10
1 files changed, 9 insertions, 1 deletions
diff --git a/sql/wsrep_client_service.cc b/sql/wsrep_client_service.cc
index d3b4a181..e26cac50 100644
--- a/sql/wsrep_client_service.cc
+++ b/sql/wsrep_client_service.cc
@@ -281,11 +281,18 @@ enum wsrep::provider::status Wsrep_client_service::replay()
original THD state during replication event applying.
*/
THD *replayer_thd= new THD(true, true);
+ // Replace the security context of the replayer with the security context
+ // of the original THD. Since security context class doesn't have proper
+ // copy constructors, we need to store the original one and set it back
+ // before destruction so that THD desctruction doesn't cause double-free
+ // on the replaced security context.
+ Security_context old_ctx = replayer_thd->main_security_ctx;
+ replayer_thd->main_security_ctx = m_thd->main_security_ctx;
replayer_thd->thread_stack= m_thd->thread_stack;
replayer_thd->real_id= pthread_self();
replayer_thd->prior_thr_create_utime=
replayer_thd->start_utime= microsecond_interval_timer();
- replayer_thd->set_command(COM_SLEEP);
+ replayer_thd->mark_connection_idle();
replayer_thd->reset_for_next_command(true);
enum wsrep::provider::status ret;
@@ -297,6 +304,7 @@ enum wsrep::provider::status Wsrep_client_service::replay()
replayer_service.replay_status(ret);
}
+ replayer_thd->main_security_ctx = old_ctx;
delete replayer_thd;
DBUG_RETURN(ret);
}