continue;
}
- if (reg->ev == ev) {
+ if (tevent_context_same_loop(reg->ev, ev)) {
reg->refcount += 1;
return true;
}
continue;
}
- if (reg->ev == ev) {
+ if (tevent_context_same_loop(reg->ev, ev)) {
reg->refcount -= 1;
if (reg->refcount == 0) {
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);
/*
* 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);
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;