summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
authorStaale Smedseng <staale.smedseng@sun.com>2010-02-26 15:30:14 +0100
committerStaale Smedseng <staale.smedseng@sun.com>2010-02-26 15:30:14 +0100
commit600a28368916ae07c0694ae090dcba7f2c52b12a (patch)
treeb32a770ac7c9db71ae25b1590e774c3fe0f3a43f /mysys
parentca6691533a7e2a454bbb614583a0058bf7acd2d2 (diff)
downloadmariadb-git-600a28368916ae07c0694ae090dcba7f2c52b12a.tar.gz
Bug #45058 init_available_charsets uses double checked locking
A client doing multiple mysql_library_init() and mysql_library_end() calls over the lifetime of the process may experience lost character set data, potentially even a SIGSEGV. This patch reinstates the reloading of character set data when a mysql_library_init() is done after a mysql_library_end().
Diffstat (limited to 'mysys')
-rw-r--r--mysys/charset.c5
-rw-r--r--mysys/my_init.c1
2 files changed, 6 insertions, 0 deletions
diff --git a/mysys/charset.c b/mysys/charset.c
index b1b91d716ba..584b33b2d6a 100644
--- a/mysys/charset.c
+++ b/mysys/charset.c
@@ -427,6 +427,11 @@ static void init_available_charsets(void)
}
+void free_charsets(void)
+{
+ charsets_initialized= MY_PTHREAD_ONCE_INIT;
+}
+
uint get_collation_number(const char *name)
{
my_pthread_once(&charsets_initialized, init_available_charsets);
diff --git a/mysys/my_init.c b/mysys/my_init.c
index 453c72f999f..a60927be693 100644
--- a/mysys/my_init.c
+++ b/mysys/my_init.c
@@ -165,6 +165,7 @@ void my_end(int infoflag)
my_print_open_files();
}
}
+ free_charsets();
my_error_unregister_all();
my_once_free();