summaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
authorShishir Jaiswal <shishir.j.jaiswal@oracle.com>2015-09-16 18:58:43 +0530
committerShishir Jaiswal <shishir.j.jaiswal@oracle.com>2015-09-16 18:58:43 +0530
commit17387bc574a4054a9aeac7ba4aa60e25588dc7bf (patch)
treefafe0ea8486b45271af0d310b88b6afe0e6d20f3 /plugin
parentadf12e6e1704dbf4f5e06fa45f40ab5b71514cff (diff)
downloadmariadb-git-17387bc574a4054a9aeac7ba4aa60e25588dc7bf.tar.gz
Bug #21467458 - UNINSTALL PLUGIN DAEMON_EXAMPLE CRASHES
MYSQLD. DESCRIPTION =========== Crash occurs when daemon_example plugin is uninstalled immediately after its installed. This can be reproduced by installing and uninstalling the plugin repeatedly. ANALYSIS ======== The daemon_example_plugin_deinit() function of the daemon example plugin calls pthread_cancel() but doesn't wait for the worker thread to actually complete before deallocating the data buffer and closing the file that it writes to. This is causing SEGFAULT! FIX === Added a pthread_join() to wait for the thread to complete before doing the cleanup work. Removed a stray 'x' variable from the example code. NOTE ==== Have made an entry in .opt file as given below: --plugin-dir=$DAEMONEXAMPLE_DIR This is done so that the program takes plugin directory as ../<dbg>/plugin/daemon_example/ instead of ../lib/plugin/
Diffstat (limited to 'plugin')
-rw-r--r--plugin/daemon_example/daemon_example.cc12
1 files changed, 9 insertions, 3 deletions
diff --git a/plugin/daemon_example/daemon_example.cc b/plugin/daemon_example/daemon_example.cc
index ac4841b10b2..129469405b8 100644
--- a/plugin/daemon_example/daemon_example.cc
+++ b/plugin/daemon_example/daemon_example.cc
@@ -1,4 +1,5 @@
-/* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+/* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights
+ reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -46,7 +47,6 @@ pthread_handler_t mysql_heartbeat(void *p)
DBUG_ENTER("mysql_heartbeat");
struct mysql_heartbeat_context *con= (struct mysql_heartbeat_context *)p;
char buffer[HEART_STRING_BUFFER];
- unsigned int x= 0;
time_t result;
struct tm tm_tmp;
@@ -65,7 +65,6 @@ pthread_handler_t mysql_heartbeat(void *p)
tm_tmp.tm_min,
tm_tmp.tm_sec);
my_write(con->heartbeat_file, (uchar*) buffer, strlen(buffer), MYF(0));
- x++;
}
DBUG_RETURN(0);
@@ -173,6 +172,13 @@ static int daemon_example_plugin_deinit(void *p)
tm_tmp.tm_min,
tm_tmp.tm_sec);
my_write(con->heartbeat_file, (uchar*) buffer, strlen(buffer), MYF(0));
+
+ /*
+ Need to wait for the hearbeat thread to terminate before closing
+ the file it writes to and freeing the memory it uses.
+ */
+ pthread_join(con->heartbeat_thread, NULL);
+
my_close(con->heartbeat_file, MYF(0));
my_free(con);