Commit a6b225ba authored by unknown's avatar unknown

charset.c:

  Bug#12109 possible locking bug in init_available_charset
  Recheck charset_initialized inside locked code,
  to garantee two threads are not entering
  consequently.


mysys/charset.c:
  Bug#12109 possible locking bug in init_available_charset
  Recheck charset_initialized inside locked code,
  to garantee two threads are not entering
  consequently.
parent bdc0c671
...@@ -383,26 +383,28 @@ static my_bool init_available_charsets(myf myflags) ...@@ -383,26 +383,28 @@ static my_bool init_available_charsets(myf myflags)
while we may changing the cs_info_table while we may changing the cs_info_table
*/ */
pthread_mutex_lock(&THR_LOCK_charset); pthread_mutex_lock(&THR_LOCK_charset);
if (!charset_initialized)
bzero(&all_charsets,sizeof(all_charsets));
init_compiled_charsets(myflags);
/* Copy compiled charsets */
for (cs=all_charsets;
cs < all_charsets+array_elements(all_charsets)-1 ;
cs++)
{ {
if (*cs) bzero(&all_charsets,sizeof(all_charsets));
init_compiled_charsets(myflags);
/* Copy compiled charsets */
for (cs=all_charsets;
cs < all_charsets+array_elements(all_charsets)-1 ;
cs++)
{ {
if (cs[0]->ctype) if (*cs)
if (init_state_maps(*cs)) {
*cs= NULL; if (cs[0]->ctype)
if (init_state_maps(*cs))
*cs= NULL;
}
} }
strmov(get_charsets_dir(fname), MY_CHARSET_INDEX);
error= my_read_charset_file(fname,myflags);
charset_initialized=1;
} }
strmov(get_charsets_dir(fname), MY_CHARSET_INDEX);
error= my_read_charset_file(fname,myflags);
charset_initialized=1;
pthread_mutex_unlock(&THR_LOCK_charset); pthread_mutex_unlock(&THR_LOCK_charset);
} }
return error; return error;
......
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