]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
winbind: winbind_messaging_context -> server_messaging_context
authorVolker Lendecke <vl@samba.org>
Fri, 17 Nov 2017 10:42:34 +0000 (11:42 +0100)
committerKarolin Seeger <kseeger@samba.org>
Wed, 22 Nov 2017 08:48:18 +0000 (09:48 +0100)
Don't use winbind_messaging_context anymore.

This fixes a bug analysed by Peter Somogyi <PSOMOGYI@hu.ibm.com>: 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 <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
(cherry picked from commit d8a01d09c13728f36107f6eb94ecb7653706a4db)

source3/winbindd/winbindd.c
source3/winbindd/winbindd_cm.c
source3/winbindd/winbindd_dual.c
source3/winbindd/winbindd_dual_srv.c

index 6ff697a689f97602acd021bb5c0dda2a7c7d3a45..e83ab332100081c0a82a6ead1b3d8e273e52ff41 100644 (file)
@@ -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 */
 
index b507f1ad25bba533655c8df4686d3c5668a561ce..e09ba8479bf6e4db7258a1c77965ac01f55429cb 100644 (file)
@@ -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;
index 0b98a8368e494efae7c3a2466d03c9772801cace..eaa7d9f26f9ed9d33686685ec69138eba86a75b3 100644 (file)
@@ -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);
 
index 0a2a5e27f8fc3c3838e22ffd0a91dffa4725cc02..d083534aed7e831bac92f1167f027ce0b01ed584 100644 (file)
@@ -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;