Commit 0633a41c authored by unknown's avatar unknown

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

check_stack_overrun().


sql/slave.cc:
  Move initialization of THD::thread_stack before THD::store_globals()
sql/sql_acl.cc:
  Initialize THD::thread_stack in artificial THDs used
  to load gratns subsystem.
sql/sql_class.cc:
  Add an assert that THD::thread_stack is assigned.
sql/sql_insert.cc:
  Add initialization of THD::thread_stack (delayed insert
  thread).
sql/sql_parse.cc:
  Move initialization of THD::thread_stack before
  THD::store_globals().
sql/sql_udf.cc:
  Add initialization for THD::thread_stack (an artificial
  THD used to initialize UDF subsystem).
sql/tztime.cc:
  Add initialization for THD::thread_stack (an artificial
  THD used to initialize timezones).
parent 4aea839b
......@@ -3446,6 +3446,7 @@ slave_begin:
THD_CHECK_SENTRY(thd);
pthread_detach_this_thread();
thd->thread_stack= (char*) &thd; // remember where our stack is
if (init_slave_thread(thd, SLAVE_THD_IO))
{
pthread_cond_broadcast(&mi->start_cond);
......@@ -3454,7 +3455,6 @@ slave_begin:
goto err;
}
mi->io_thd = thd;
thd->thread_stack = (char*)&thd; // remember where our stack is
pthread_mutex_lock(&LOCK_thread_count);
threads.append(thd);
pthread_mutex_unlock(&LOCK_thread_count);
......
......@@ -158,6 +158,7 @@ my_bool acl_init(bool dont_read_acl_tables)
*/
if (!(thd=new THD))
DBUG_RETURN(1); /* purecov: inspected */
thd->thread_stack= (char*) &thd;
thd->store_globals();
/*
It is safe to call acl_reload() since acl_* arrays and hashes which
......@@ -3263,6 +3264,7 @@ my_bool grant_init()
if (!(thd= new THD))
DBUG_RETURN(1); /* purecov: deadcode */
thd->thread_stack= (char*) &thd;
thd->store_globals();
return_val= grant_reload(thd);
delete thd;
......
......@@ -517,6 +517,12 @@ void THD::awake(THD::killed_state state_to_set)
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) ||
my_pthread_setspecific_ptr(THR_MALLOC, &mem_root))
return 1;
......
......@@ -1723,6 +1723,7 @@ pthread_handler_t handle_delayed_insert(void *arg)
#endif
DBUG_ENTER("handle_delayed_insert");
thd->thread_stack= (char*) &thd;
if (init_thr_lock() || thd->store_globals())
{
thd->fatal_error();
......
......@@ -1097,6 +1097,7 @@ pthread_handler_t handle_one_connection(void *arg)
VOID(sigemptyset(&set)); // Get mask in use
VOID(pthread_sigmask(SIG_UNBLOCK,&set,&thd->block_signals));
#endif
thd->thread_stack= (char*) &thd;
if (thd->store_globals())
{
close_connection(thd, ER_OUT_OF_RESOURCES, 1);
......@@ -1110,7 +1111,6 @@ pthread_handler_t handle_one_connection(void *arg)
int error;
NET *net= &thd->net;
Security_context *sctx= thd->security_ctx;
thd->thread_stack= (char*) &thd;
net->no_send_error= 0;
if ((error=check_connection(thd)))
......@@ -5288,6 +5288,7 @@ bool check_stack_overrun(THD *thd, long margin,
char *buf __attribute__((unused)))
{
long stack_used;
DBUG_ASSERT(thd == current_thd);
if ((stack_used=used_stack(thd->thread_stack,(char*) &stack_used)) >=
(long) (thread_stack - margin))
{
......@@ -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().
*/
if (!thd && (thd= (tmp_thd= new THD)))
{
thd->thread_stack= (char*) &tmp_thd;
thd->store_globals();
}
if (thd)
{
(void)acl_reload(thd);
......
......@@ -159,6 +159,7 @@ void udf_init()
DBUG_VOID_RETURN;
}
initialized = 1;
new_thd->thread_stack= (char*) &new_thd;
new_thd->store_globals();
new_thd->db= my_strdup("mysql", MYF(0));
new_thd->db_length=5;
......
......@@ -1532,6 +1532,7 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap)
*/
if (!(thd= new THD))
DBUG_RETURN(1);
thd->thread_stack= (char*) &thd;
thd->store_globals();
/* 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