[SCM] CTDB repository - branch master updated -
15bc66ae801b0c69a65a7a2acf5df151e76edc2a
Ronnie Sahlberg
sahlberg at samba.org
Fri Jul 11 00:43:28 GMT 2008
The branch, master has been updated
via 15bc66ae801b0c69a65a7a2acf5df151e76edc2a (commit)
from f4a6dd98c86f2028c00b62313a071a94cafc95f9 (commit)
http://gitweb.samba.org/?p=sahlberg/ctdb.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 15bc66ae801b0c69a65a7a2acf5df151e76edc2a
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Fri Jul 11 10:33:46 2008 +1000
Fix a very subtle race where we could get a double free of a talloced
memory if ctdb_run_eventscript() would be called
during processing of ctdb_event_script_timeout() for
user unvoked eventscripts. (eventsccripts invoked by "ctdb eventscript ...")
Signed-off-by: Ronnie Sahlberg <ronniesahlberg at gmail.com>
-----------------------------------------------------------------------
Summary of changes:
server/eventscript.c | 13 +++++++++----
1 files changed, 9 insertions(+), 4 deletions(-)
Changeset truncated at 500 lines:
diff --git a/server/eventscript.c b/server/eventscript.c
index 1d42b2b..3168122 100644
--- a/server/eventscript.c
+++ b/server/eventscript.c
@@ -252,10 +252,15 @@ static void ctdb_event_script_timeout(struct event_context *ev, struct timed_eve
void (*callback)(struct ctdb_context *, int, void *) = state->callback;
void *private_data = state->private_data;
struct ctdb_context *ctdb = state->ctdb;
+ char *options;
DEBUG(DEBUG_ERR,("Event script timed out : %s count : %u\n", state->options, ctdb->event_script_timeouts));
- if (!strcmp(state->options, "monitor")) {
+ options = talloc_strdup(ctdb, state->options);
+ CTDB_NO_MEMORY_VOID(ctdb, options);
+
+ talloc_free(state);
+ if (!strcmp(options, "monitor")) {
/* if it is a monitor event, we allow it to "hang" a few times
before we declare it a failure and ban ourself (and make
ourself unhealthy)
@@ -271,7 +276,7 @@ static void ctdb_event_script_timeout(struct event_context *ev, struct timed_eve
} else {
callback(ctdb, 0, private_data);
}
- } else if (!strcmp(state->options, "startup")) {
+ } else if (!strcmp(options, "startup")) {
DEBUG(DEBUG_ERR, (__location__ " eventscript for startup event timedout.\n"));
callback(ctdb, -1, private_data);
} else {
@@ -281,7 +286,7 @@ static void ctdb_event_script_timeout(struct event_context *ev, struct timed_eve
callback(ctdb, -1, private_data);
}
- talloc_free(state);
+ talloc_free(options);
}
/*
@@ -480,7 +485,7 @@ int32_t ctdb_run_eventscripts(struct ctdb_context *ctdb,
state = talloc(ctdb->eventscripts_ctx, struct eventscript_callback_state);
CTDB_NO_MEMORY(ctdb, state);
- state->c = talloc_steal(ctdb, c);
+ state->c = talloc_steal(state, c);
DEBUG(DEBUG_NOTICE,("Forced running of eventscripts with arguments %s\n", indata.dptr));
--
CTDB repository
More information about the samba-cvs
mailing list