diff options
author | Davi Arnaut <Davi.Arnaut@Sun.COM> | 2009-04-09 12:25:25 -0300 |
---|---|---|
committer | Davi Arnaut <Davi.Arnaut@Sun.COM> | 2009-04-09 12:25:25 -0300 |
commit | 064c1b2cac3ee742d0384edcc4b1988a8c8eba60 (patch) | |
tree | 88259eaac8d31d3ec748805a745888380eb8f91f /mysys | |
parent | 49ab04970747cc05d2fc760e9700e3037883ac8e (diff) | |
download | mariadb-git-064c1b2cac3ee742d0384edcc4b1988a8c8eba60.tar.gz |
Bug#43706: libmysqld segfaults when re-intialised
Bug#44091: libmysqld gets stuck waiting on mutex on initialization
The problem was that libmysqld wasn't enforcing a certain
initialization and deinitialization order for the mysys
library. Another problem was that the global object used
for management of log event handlers (aka LOGGER) wasn't
being prepared for a possible reutilization.
What leads to the hang/crash reported is that a failure
to load the language file triggers a double call of the
cleanup functions, causing an already destroyed mutex to
be used.
The solution is enforce a order on the initialization and
deinitialization of the mysys library within the libmysqld
library and to ensure that the global LOGGER object reset
it's internal state during cleanup.
Diffstat (limited to 'mysys')
-rw-r--r-- | mysys/my_init.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/mysys/my_init.c b/mysys/my_init.c index b330ffac65a..a60927be693 100644 --- a/mysys/my_init.c +++ b/mysys/my_init.c @@ -136,6 +136,10 @@ void my_end(int infoflag) */ FILE *info_file= DBUG_FILE; my_bool print_info= (info_file != stderr); + + if (!my_init_done) + return; + /* We do not use DBUG_ENTER here, as after cleanup DBUG is no longer operational, so we cannot use DBUG_RETURN. |