From: Volker Lendecke Date: Fri, 17 Nov 2017 10:42:34 +0000 (+0100) Subject: winbind: winbind_messaging_context -> server_messaging_context X-Git-Tag: samba-4.6.12~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65bbf314782d70a72c8500e4bcebefc8eefc102c;p=thirdparty%2Fsamba.git winbind: winbind_messaging_context -> server_messaging_context Don't use winbind_messaging_context anymore. This fixes a bug analysed by Peter Somogyi : If a parent winbind forks, it only called reinit_after_fork on winbind_messaging_context. On the other hand, deep in dbwrap_open we use server_messaging_context(). This is not reinitialized by winbind_reinit_after fork, so the parent and child share a ctdb connection. This is invalid, because replies from ctdb end up in the wrong process. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13150 Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison (cherry picked from commit d8a01d09c13728f36107f6eb94ecb7653706a4db) --- diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 6ff697a689f..e83ab332100 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -239,7 +239,7 @@ static void terminate(bool is_parent) #endif if (is_parent) { - struct messaging_context *msg = winbind_messaging_context(); + struct messaging_context *msg = server_messaging_context(); struct server_id self = messaging_server_id(msg); serverid_deregister(self); pidfile_unlink(lp_pid_directory(), "winbindd"); @@ -1348,9 +1348,9 @@ static void winbindd_register_handlers(struct messaging_context *msg_ctx, MSG_WINBIND_ONLINESTATUS, winbind_msg_onlinestatus); /* Handle domain online/offline messages for domains */ - messaging_register(winbind_messaging_context(), NULL, + messaging_register(server_messaging_context(), NULL, MSG_WINBIND_DOMAIN_OFFLINE, winbind_msg_domain_offline); - messaging_register(winbind_messaging_context(), NULL, + messaging_register(server_messaging_context(), NULL, MSG_WINBIND_DOMAIN_ONLINE, winbind_msg_domain_online); messaging_register(msg_ctx, NULL, @@ -1661,7 +1661,7 @@ int main(int argc, const char **argv) /* Initialise messaging system */ - if (winbind_messaging_context() == NULL) { + if (server_messaging_context() == NULL) { exit(1); } @@ -1755,7 +1755,7 @@ int main(int argc, const char **argv) * winbindd-specific resources we must free yet. JRA. */ - status = reinit_after_fork(winbind_messaging_context(), + status = reinit_after_fork(server_messaging_context(), server_event_context(), false, NULL); if (!NT_STATUS_IS_OK(status)) { @@ -1772,9 +1772,9 @@ int main(int argc, const char **argv) exit_daemon(nt_errstr(status), map_errno_from_nt_status(status)); } - winbindd_register_handlers(winbind_messaging_context(), !Fork); + winbindd_register_handlers(server_messaging_context(), !Fork); - if (!messaging_parent_dgm_cleanup_init(winbind_messaging_context())) { + if (!messaging_parent_dgm_cleanup_init(server_messaging_context())) { exit(1); } @@ -1787,7 +1787,7 @@ int main(int argc, const char **argv) rpc_samr_init(NULL); winbindd_init_addrchange(NULL, server_event_context(), - winbind_messaging_context()); + server_messaging_context()); /* setup listen sockets */ diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c index b507f1ad25b..e09ba8479bf 100644 --- a/source3/winbindd/winbindd_cm.c +++ b/source3/winbindd/winbindd_cm.c @@ -222,10 +222,10 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain) if (domain->dc_probe_pid != (pid_t)0) { /* Parent */ - messaging_register(winbind_messaging_context(), NULL, + messaging_register(server_messaging_context(), NULL, MSG_WINBIND_TRY_TO_GO_ONLINE, msg_try_to_go_online); - messaging_register(winbind_messaging_context(), NULL, + messaging_register(server_messaging_context(), NULL, MSG_WINBIND_FAILED_TO_GO_ONLINE, msg_failed_to_go_online); return True; @@ -246,7 +246,7 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain) if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("winbindd_reinit_after_fork failed: %s\n", nt_errstr(status))); - messaging_send_buf(winbind_messaging_context(), + messaging_send_buf(server_messaging_context(), pid_to_procid(parent_pid), MSG_WINBIND_FAILED_TO_GO_ONLINE, (const uint8_t *)domain->name, @@ -258,7 +258,7 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain) mem_ctx = talloc_init("fork_child_dc_connect"); if (!mem_ctx) { DEBUG(0,("talloc_init failed.\n")); - messaging_send_buf(winbind_messaging_context(), + messaging_send_buf(server_messaging_context(), pid_to_procid(parent_pid), MSG_WINBIND_FAILED_TO_GO_ONLINE, (const uint8_t *)domain->name, @@ -268,7 +268,7 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain) if ((!get_dcs(mem_ctx, domain, &dcs, &num_dcs)) || (num_dcs == 0)) { /* Still offline ? Can't find DC's. */ - messaging_send_buf(winbind_messaging_context(), + messaging_send_buf(server_messaging_context(), pid_to_procid(parent_pid), MSG_WINBIND_FAILED_TO_GO_ONLINE, (const uint8_t *)domain->name, @@ -279,7 +279,7 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain) /* We got a DC. Send a message to our parent to get it to try and do the same. */ - messaging_send_buf(winbind_messaging_context(), + messaging_send_buf(server_messaging_context(), pid_to_procid(parent_pid), MSG_WINBIND_TRY_TO_GO_ONLINE, (const uint8_t *)domain->name, @@ -443,7 +443,7 @@ void set_domain_offline(struct winbindd_domain *domain) /* Send a message to the parent that the domain is offline. */ if (parent_pid > 1 && !domain->internal) { - messaging_send_buf(winbind_messaging_context(), + messaging_send_buf(server_messaging_context(), pid_to_procid(parent_pid), MSG_WINBIND_DOMAIN_OFFLINE, (uint8_t *)domain->name, @@ -457,7 +457,7 @@ void set_domain_offline(struct winbindd_domain *domain) struct winbindd_child *idmap = idmap_child(); if ( idmap->pid != 0 ) { - messaging_send_buf(winbind_messaging_context(), + messaging_send_buf(server_messaging_context(), pid_to_procid(idmap->pid), MSG_WINBIND_OFFLINE, (const uint8_t *)domain->name, @@ -520,16 +520,16 @@ static void set_domain_online(struct winbindd_domain *domain) TALLOC_FREE(domain->check_online_event); /* Ensure we ignore any pending child messages. */ - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_WINBIND_TRY_TO_GO_ONLINE, NULL); - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_WINBIND_FAILED_TO_GO_ONLINE, NULL); domain->online = True; /* Send a message to the parent that the domain is online. */ if (parent_pid > 1 && !domain->internal) { - messaging_send_buf(winbind_messaging_context(), + messaging_send_buf(server_messaging_context(), pid_to_procid(parent_pid), MSG_WINBIND_DOMAIN_ONLINE, (uint8_t *)domain->name, @@ -543,7 +543,7 @@ static void set_domain_online(struct winbindd_domain *domain) struct winbindd_child *idmap = idmap_child(); if ( idmap->pid != 0 ) { - messaging_send_buf(winbind_messaging_context(), + messaging_send_buf(server_messaging_context(), pid_to_procid(idmap->pid), MSG_WINBIND_ONLINE, (const uint8_t *)domain->name, @@ -1412,7 +1412,7 @@ static bool dcip_to_name(TALLOC_CTX *mem_ctx, } #endif - status = nbt_getdc(winbind_messaging_context(), 10, pss, domain->name, + status = nbt_getdc(server_messaging_context(), 10, pss, domain->name, &domain->sid, nt_version, mem_ctx, &nt_version, &dc_name, NULL); if (NT_STATUS_IS_OK(status)) { @@ -1778,14 +1778,14 @@ NTSTATUS wb_open_internal_pipe(TALLOC_CTX *mem_ctx, table, session_info, NULL, - winbind_messaging_context(), + server_messaging_context(), &cli); } else { status = rpc_pipe_open_internal(mem_ctx, table, session_info, NULL, - winbind_messaging_context(), + server_messaging_context(), &cli); } if (!NT_STATUS_IS_OK(status)) { @@ -3199,7 +3199,7 @@ static NTSTATUS cm_connect_netlogon_transport(struct winbindd_domain *domain, enum dcerpc_transport_t transport, struct rpc_pipe_client **cli) { - struct messaging_context *msg_ctx = winbind_messaging_context(); + struct messaging_context *msg_ctx = server_messaging_context(); struct winbindd_cm_conn *conn; NTSTATUS result; enum netr_SchannelType sec_chan_type; diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index 0b98a8368e4..eaa7d9f26f9 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -1051,7 +1051,7 @@ static void machine_password_change_handler(struct tevent_context *ctx, struct timeval now, void *private_data) { - struct messaging_context *msg_ctx = winbind_messaging_context(); + struct messaging_context *msg_ctx = server_messaging_context(); struct winbindd_child *child = (struct winbindd_child *)private_data; struct rpc_pipe_client *netlogon_pipe = NULL; @@ -1250,7 +1250,7 @@ NTSTATUS winbindd_reinit_after_fork(const struct winbindd_child *myself, NTSTATUS status; status = reinit_after_fork( - winbind_messaging_context(), + server_messaging_context(), server_event_context(), true, NULL); if (!NT_STATUS_IS_OK(status)) { @@ -1275,26 +1275,26 @@ NTSTATUS winbindd_reinit_after_fork(const struct winbindd_child *myself, CatchChild(); /* Don't handle the same messages as our parent. */ - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_SMB_CONF_UPDATED, NULL); - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_SHUTDOWN, NULL); - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_WINBIND_OFFLINE, NULL); - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_WINBIND_ONLINE, NULL); - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_WINBIND_ONLINESTATUS, NULL); - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_DUMP_EVENT_LIST, NULL); - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_WINBIND_DUMP_DOMAIN_LIST, NULL); - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_DEBUG, NULL); - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_WINBIND_DOMAIN_OFFLINE, NULL); - messaging_deregister(winbind_messaging_context(), + messaging_deregister(server_messaging_context(), MSG_WINBIND_DOMAIN_ONLINE, NULL); /* We have destroyed all events in the winbindd_event_context @@ -1492,15 +1492,15 @@ static bool fork_domain_child(struct winbindd_child *child) } /* Handle online/offline messages. */ - messaging_register(winbind_messaging_context(), NULL, + messaging_register(server_messaging_context(), NULL, MSG_WINBIND_OFFLINE, child_msg_offline); - messaging_register(winbind_messaging_context(), NULL, + messaging_register(server_messaging_context(), NULL, MSG_WINBIND_ONLINE, child_msg_online); - messaging_register(winbind_messaging_context(), NULL, + messaging_register(server_messaging_context(), NULL, MSG_DUMP_EVENT_LIST, child_msg_dump_event_list); - messaging_register(winbind_messaging_context(), NULL, + messaging_register(server_messaging_context(), NULL, MSG_DEBUG, debug_message); - messaging_register(winbind_messaging_context(), NULL, + messaging_register(server_messaging_context(), NULL, MSG_WINBIND_IP_DROPPED, winbind_msg_ip_dropped); diff --git a/source3/winbindd/winbindd_dual_srv.c b/source3/winbindd/winbindd_dual_srv.c index 0a2a5e27f8f..d083534aed7 100644 --- a/source3/winbindd/winbindd_dual_srv.c +++ b/source3/winbindd/winbindd_dual_srv.c @@ -518,7 +518,7 @@ NTSTATUS _wbint_DsGetDcName(struct pipes_struct *p, struct wbint_DsGetDcName *r) struct dcerpc_binding_handle *b; if (domain == NULL) { - return dsgetdcname(p->mem_ctx, winbind_messaging_context(), + return dsgetdcname(p->mem_ctx, server_messaging_context(), r->in.domain_name, r->in.domain_guid, r->in.site_name ? r->in.site_name : "", r->in.flags, @@ -710,7 +710,7 @@ again: NTSTATUS _wbint_ChangeMachineAccount(struct pipes_struct *p, struct wbint_ChangeMachineAccount *r) { - struct messaging_context *msg_ctx = winbind_messaging_context(); + struct messaging_context *msg_ctx = server_messaging_context(); struct winbindd_domain *domain; NTSTATUS status; struct rpc_pipe_client *netlogon_pipe; @@ -1353,7 +1353,7 @@ static WERROR _winbind_LogonControl_CHANGE_PASSWORD(struct pipes_struct *p, struct winbindd_domain *domain, struct winbind_LogonControl *r) { - struct messaging_context *msg_ctx = winbind_messaging_context(); + struct messaging_context *msg_ctx = server_messaging_context(); NTSTATUS status; struct rpc_pipe_client *netlogon_pipe; struct cli_credentials *creds = NULL;