Commit b1d951d4 authored by konstantin@mysql.com's avatar konstantin@mysql.com

Always initialize THD::thread_stack: it's used in

check_stack_overrun().
parent 83d692da
...@@ -3446,6 +3446,7 @@ slave_begin: ...@@ -3446,6 +3446,7 @@ slave_begin:
THD_CHECK_SENTRY(thd); THD_CHECK_SENTRY(thd);
pthread_detach_this_thread(); pthread_detach_this_thread();
thd->thread_stack= (char*) &thd; // remember where our stack is
if (init_slave_thread(thd, SLAVE_THD_IO)) if (init_slave_thread(thd, SLAVE_THD_IO))
{ {
pthread_cond_broadcast(&mi->start_cond); pthread_cond_broadcast(&mi->start_cond);
...@@ -3454,7 +3455,6 @@ slave_begin: ...@@ -3454,7 +3455,6 @@ slave_begin:
goto err; goto err;
} }
mi->io_thd = thd; mi->io_thd = thd;
thd->thread_stack = (char*)&thd; // remember where our stack is
pthread_mutex_lock(&LOCK_thread_count); pthread_mutex_lock(&LOCK_thread_count);
threads.append(thd); threads.append(thd);
pthread_mutex_unlock(&LOCK_thread_count); pthread_mutex_unlock(&LOCK_thread_count);
......
...@@ -158,6 +158,7 @@ my_bool acl_init(bool dont_read_acl_tables) ...@@ -158,6 +158,7 @@ my_bool acl_init(bool dont_read_acl_tables)
*/ */
if (!(thd=new THD)) if (!(thd=new THD))
DBUG_RETURN(1); /* purecov: inspected */ DBUG_RETURN(1); /* purecov: inspected */
thd->thread_stack= (char*) &thd;
thd->store_globals(); thd->store_globals();
/* /*
It is safe to call acl_reload() since acl_* arrays and hashes which It is safe to call acl_reload() since acl_* arrays and hashes which
...@@ -3263,6 +3264,7 @@ my_bool grant_init() ...@@ -3263,6 +3264,7 @@ my_bool grant_init()
if (!(thd= new THD)) if (!(thd= new THD))
DBUG_RETURN(1); /* purecov: deadcode */ DBUG_RETURN(1); /* purecov: deadcode */
thd->thread_stack= (char*) &thd;
thd->store_globals(); thd->store_globals();
return_val= grant_reload(thd); return_val= grant_reload(thd);
delete thd; delete thd;
......
...@@ -517,6 +517,12 @@ void THD::awake(THD::killed_state state_to_set) ...@@ -517,6 +517,12 @@ void THD::awake(THD::killed_state state_to_set)
bool THD::store_globals() bool THD::store_globals()
{ {
/*
Assert that thread_stack is initialized: it's necessary to be able
to track stack overrun.
*/
DBUG_ASSERT(this->thread_stack);
if (my_pthread_setspecific_ptr(THR_THD, this) || if (my_pthread_setspecific_ptr(THR_THD, this) ||
my_pthread_setspecific_ptr(THR_MALLOC, &mem_root)) my_pthread_setspecific_ptr(THR_MALLOC, &mem_root))
return 1; return 1;
......
...@@ -1723,6 +1723,7 @@ pthread_handler_t handle_delayed_insert(void *arg) ...@@ -1723,6 +1723,7 @@ pthread_handler_t handle_delayed_insert(void *arg)
#endif #endif
DBUG_ENTER("handle_delayed_insert"); DBUG_ENTER("handle_delayed_insert");
thd->thread_stack= (char*) &thd;
if (init_thr_lock() || thd->store_globals()) if (init_thr_lock() || thd->store_globals())
{ {
thd->fatal_error(); thd->fatal_error();
......
...@@ -1097,6 +1097,7 @@ pthread_handler_t handle_one_connection(void *arg) ...@@ -1097,6 +1097,7 @@ pthread_handler_t handle_one_connection(void *arg)
VOID(sigemptyset(&set)); // Get mask in use VOID(sigemptyset(&set)); // Get mask in use
VOID(pthread_sigmask(SIG_UNBLOCK,&set,&thd->block_signals)); VOID(pthread_sigmask(SIG_UNBLOCK,&set,&thd->block_signals));
#endif #endif
thd->thread_stack= (char*) &thd;
if (thd->store_globals()) if (thd->store_globals())
{ {
close_connection(thd, ER_OUT_OF_RESOURCES, 1); close_connection(thd, ER_OUT_OF_RESOURCES, 1);
...@@ -1110,7 +1111,6 @@ pthread_handler_t handle_one_connection(void *arg) ...@@ -1110,7 +1111,6 @@ pthread_handler_t handle_one_connection(void *arg)
int error; int error;
NET *net= &thd->net; NET *net= &thd->net;
Security_context *sctx= thd->security_ctx; Security_context *sctx= thd->security_ctx;
thd->thread_stack= (char*) &thd;
net->no_send_error= 0; net->no_send_error= 0;
if ((error=check_connection(thd))) if ((error=check_connection(thd)))
...@@ -5288,6 +5288,7 @@ bool check_stack_overrun(THD *thd, long margin, ...@@ -5288,6 +5288,7 @@ bool check_stack_overrun(THD *thd, long margin,
char *buf __attribute__((unused))) char *buf __attribute__((unused)))
{ {
long stack_used; long stack_used;
DBUG_ASSERT(thd == current_thd);
if ((stack_used=used_stack(thd->thread_stack,(char*) &stack_used)) >= if ((stack_used=used_stack(thd->thread_stack,(char*) &stack_used)) >=
(long) (thread_stack - margin)) (long) (thread_stack - margin))
{ {
...@@ -6737,7 +6738,10 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables, ...@@ -6737,7 +6738,10 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
allocate temporary THD for execution of acl_reload()/grant_reload(). allocate temporary THD for execution of acl_reload()/grant_reload().
*/ */
if (!thd && (thd= (tmp_thd= new THD))) if (!thd && (thd= (tmp_thd= new THD)))
{
thd->thread_stack= (char*) &tmp_thd;
thd->store_globals(); thd->store_globals();
}
if (thd) if (thd)
{ {
(void)acl_reload(thd); (void)acl_reload(thd);
......
...@@ -159,6 +159,7 @@ void udf_init() ...@@ -159,6 +159,7 @@ void udf_init()
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
initialized = 1; initialized = 1;
new_thd->thread_stack= (char*) &new_thd;
new_thd->store_globals(); new_thd->store_globals();
new_thd->db= my_strdup("mysql", MYF(0)); new_thd->db= my_strdup("mysql", MYF(0));
new_thd->db_length=5; new_thd->db_length=5;
......
...@@ -1532,6 +1532,7 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap) ...@@ -1532,6 +1532,7 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap)
*/ */
if (!(thd= new THD)) if (!(thd= new THD))
DBUG_RETURN(1); DBUG_RETURN(1);
thd->thread_stack= (char*) &thd;
thd->store_globals(); thd->store_globals();
/* Init all memory structures that require explicit destruction */ /* Init all memory structures that require explicit destruction */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment