summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2018-03-23 14:48:46 +0100
committerRalph Boehme <slow@samba.org>2018-07-11 23:04:24 +0200
commit2b05f1098187e00166649c8ea7c63e6901b9d242 (patch)
tree1eb7e71527f8f351c5970a7ffcd6cb75bbcf0049 /source3
parent9dc332060cf5f249ea887dbc60ec7a39b6f91120 (diff)
downloadsamba-2b05f1098187e00166649c8ea7c63e6901b9d242.tar.gz
s3:messages: allow messaging_filtered_read_send() to use wrapper tevent_context
As it gets 'messaging_context' as argument, we're sure a messaging context with a raw tevent context already exist. It means we can allow a wrapper tevent context that wrapps the main tevent context of the messaging context. The use of tevent_req_defer_callback() makes sure that the callers callback function calls messaging_filtered_read_recv() from the correct "wrapped" environment. Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
Diffstat (limited to 'source3')
-rw-r--r--source3/lib/messages.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 1a5ea4659aa..dab53f1c48e 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -206,7 +206,7 @@ static bool messaging_register_event_context(struct messaging_context *ctx,
continue;
}
- if (reg->ev == ev) {
+ if (tevent_context_same_loop(reg->ev, ev)) {
reg->refcount += 1;
return true;
}
@@ -255,7 +255,7 @@ static bool messaging_deregister_event_context(struct messaging_context *ctx,
continue;
}
- if (reg->ev == ev) {
+ if (tevent_context_same_loop(reg->ev, ev)) {
reg->refcount -= 1;
if (reg->refcount == 0) {
@@ -1034,7 +1034,9 @@ struct tevent_req *messaging_filtered_read_send(
state->filter = filter;
state->private_data = private_data;
- if (tevent_context_is_wrapper(ev)) {
+ if (tevent_context_is_wrapper(ev) &&
+ !tevent_context_same_loop(ev, msg_ctx->event_ctx))
+ {
/* This is really a programmer error! */
DBG_ERR("Wrapper tevent context doesn't use main context.\n");
tevent_req_error(req, EINVAL);
@@ -1043,7 +1045,11 @@ struct tevent_req *messaging_filtered_read_send(
/*
* We have to defer the callback here, as we might be called from
- * within a different tevent_context than state->ev
+ * within a different tevent_context than state->ev.
+ *
+ * This is important for two cases:
+ * 1. nested event contexts, used by blocking ctdb calls
+ * 2. possible impersonation using wrapper tevent contexts.
*/
tevent_req_defer_callback(req, state->ev);
@@ -1339,7 +1345,7 @@ static bool messaging_dispatch_waiters(struct messaging_context *msg_ctx,
state = tevent_req_data(
req, struct messaging_filtered_read_state);
- if ((ev == state->ev) &&
+ if (tevent_context_same_loop(ev, state->ev) &&
state->filter(rec, state->private_data)) {
messaging_filtered_read_done(req, rec);
return true;