diff options
author | bar@mysql.com <> | 2005-07-25 21:34:20 +0500 |
---|---|---|
committer | bar@mysql.com <> | 2005-07-25 21:34:20 +0500 |
commit | 975b4969a5af736a0b46fce3831510ff65a57ea2 (patch) | |
tree | f0e138cff573db9a514e20b96ffb68eb1dc1e26d /mysys/charset.c | |
parent | ef3bc773dbc5060c2953739bbd014a29a2c7a0c4 (diff) | |
download | mariadb-git-975b4969a5af736a0b46fce3831510ff65a57ea2.tar.gz |
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.
Diffstat (limited to 'mysys/charset.c')
-rw-r--r-- | mysys/charset.c | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/mysys/charset.c b/mysys/charset.c index 4b7ad3e59f4..cabdbad3413 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -383,26 +383,28 @@ static my_bool init_available_charsets(myf myflags) while we may changing the cs_info_table */ pthread_mutex_lock(&THR_LOCK_charset); - - 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 (!charset_initialized) { - 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 (init_state_maps(*cs)) - *cs= NULL; + if (*cs) + { + 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); } return error; |