diff options
author | Ralph Boehme <slow@samba.org> | 2018-03-12 16:11:37 +0100 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2018-05-07 09:57:25 +0200 |
commit | 76a4df1eb5d5ab284c79573e769086e56648a451 (patch) | |
tree | 0b9de648092d034c850ba557ca08782fe6ed01b0 /source3 | |
parent | 30dd8bc6a345b700447dc2bcb538a1e6a87e6993 (diff) | |
download | samba-76a4df1eb5d5ab284c79573e769086e56648a451.tar.gz |
winbindd: call dcerpc_binding_handle_is_connected() from reset_cm_connection_on_error()
To consolidate the error handling for RPC calls, add the binding handle
as an additional argument to reset_cm_connection_on_error().
All callers pass NULL for now, so no change in behaviour up to here.
Bug: https://bugzilla.samba.org/show_bug.cgi?id=13332
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
(cherry picked from commit 966ff3793a867a5ffe1a49e48c8ab3ecb02f8359)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/winbindd/winbindd_dual_srv.c | 51 | ||||
-rw-r--r-- | source3/winbindd/winbindd_proto.h | 1 | ||||
-rw-r--r-- | source3/winbindd/winbindd_reconnect.c | 2 |
3 files changed, 31 insertions, 23 deletions
diff --git a/source3/winbindd/winbindd_dual_srv.c b/source3/winbindd/winbindd_dual_srv.c index b91d15ceb40..cbac76f8fe6 100644 --- a/source3/winbindd/winbindd_dual_srv.c +++ b/source3/winbindd/winbindd_dual_srv.c @@ -40,6 +40,7 @@ void _wbint_Ping(struct pipes_struct *p, struct wbint_Ping *r) } bool reset_cm_connection_on_error(struct winbindd_domain *domain, + struct dcerpc_binding_handle *b, NTSTATUS status) { if (NT_STATUS_EQUAL(status, NT_STATUS_ACCESS_DENIED) || @@ -57,6 +58,12 @@ bool reset_cm_connection_on_error(struct winbindd_domain *domain, /* We invalidated the connection. */ return true; } + + if (b != NULL && !dcerpc_binding_handle_is_connected(b)) { + invalidate_cm_connection(domain); + return true; + } + return false; } @@ -74,7 +81,7 @@ NTSTATUS _wbint_LookupSid(struct pipes_struct *p, struct wbint_LookupSid *r) status = wb_cache_sid_to_name(domain, p->mem_ctx, r->in.sid, &dom_name, &name, &type); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (!NT_STATUS_IS_OK(status)) { return status; } @@ -108,7 +115,7 @@ NTSTATUS _wbint_LookupSids(struct pipes_struct *p, struct wbint_LookupSids *r) r->out.domains = domains; } - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); return status; } @@ -124,7 +131,7 @@ NTSTATUS _wbint_LookupName(struct pipes_struct *p, struct wbint_LookupName *r) status = wb_cache_name_to_sid(domain, p->mem_ctx, r->in.domain, r->in.name, r->in.flags, r->out.sid, r->out.type); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); return status; } @@ -312,7 +319,7 @@ NTSTATUS _wbint_LookupUserAliases(struct pipes_struct *p, r->in.sids->sids, &r->out.rids->num_rids, &r->out.rids->rids); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); return status; } @@ -329,7 +336,7 @@ NTSTATUS _wbint_LookupUserGroups(struct pipes_struct *p, status = wb_cache_lookup_usergroups(domain, p->mem_ctx, r->in.sid, &r->out.sids->num_sids, &r->out.sids->sids); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); return status; } @@ -344,7 +351,7 @@ NTSTATUS _wbint_QuerySequenceNumber(struct pipes_struct *p, } status = wb_cache_sequence_number(domain, r->out.sequence); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); return status; } @@ -365,7 +372,7 @@ NTSTATUS _wbint_LookupGroupMembers(struct pipes_struct *p, status = wb_cache_lookup_groupmem(domain, p->mem_ctx, r->in.sid, r->in.type, &num_names, &sid_mem, &names, &name_types); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (!NT_STATUS_IS_OK(status)) { return status; } @@ -429,7 +436,7 @@ NTSTATUS _wbint_QueryGroupList(struct pipes_struct *p, status = wb_cache_enum_local_groups(domain, talloc_tos(), &num_local_groups, &local_groups); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (!NT_STATUS_IS_OK(status)) { return status; } @@ -438,7 +445,7 @@ NTSTATUS _wbint_QueryGroupList(struct pipes_struct *p, status = wb_cache_enum_dom_groups(domain, talloc_tos(), &num_dom_groups, &dom_groups); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (!NT_STATUS_IS_OK(status)) { return status; } @@ -511,7 +518,7 @@ NTSTATUS _wbint_QueryUserRidList(struct pipes_struct *p, status = wb_cache_query_user_list(domain, p->mem_ctx, &r->out.rids->rids); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (!NT_STATUS_IS_OK(status)) { return status; @@ -542,7 +549,7 @@ NTSTATUS _wbint_DsGetDcName(struct pipes_struct *p, struct wbint_DsGetDcName *r) status = cm_connect_netlogon(domain, &netlogon_pipe); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (!NT_STATUS_IS_OK(status)) { DEBUG(10, ("Can't contact the NETLOGON pipe\n")); return status; @@ -563,11 +570,11 @@ NTSTATUS _wbint_DsGetDcName(struct pipes_struct *p, struct wbint_DsGetDcName *r) if (NT_STATUS_IS_OK(status) && W_ERROR_IS_OK(werr)) { goto done; } - if (reset_cm_connection_on_error(domain, status)) { + if (reset_cm_connection_on_error(domain, NULL, status)) { /* Re-initialize. */ status = cm_connect_netlogon(domain, &netlogon_pipe); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (!NT_STATUS_IS_OK(status)) { DEBUG(10, ("Can't contact the NETLOGON pipe\n")); return status; @@ -602,7 +609,7 @@ NTSTATUS _wbint_DsGetDcName(struct pipes_struct *p, struct wbint_DsGetDcName *r) r->in.domain_name, &dc_info->dc_unc, &werr); } - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (!NT_STATUS_IS_OK(status)) { DEBUG(10, ("dcerpc_netr_Get[Any]DCName failed: %s\n", nt_errstr(status))); @@ -642,7 +649,7 @@ NTSTATUS _wbint_LookupRids(struct pipes_struct *p, struct wbint_LookupRids *r) status = wb_cache_rids_to_names(domain, talloc_tos(), r->in.domain_sid, r->in.rids->rids, r->in.rids->num_rids, &domain_name, &names, &types); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (!NT_STATUS_IS_OK(status)) { return status; } @@ -780,7 +787,7 @@ NTSTATUS _wbint_PingDc(struct pipes_struct *p, struct wbint_PingDc *r) reconnect: status = cm_connect_netlogon(domain, &netlogon_pipe); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (!NT_STATUS_IS_OK(status)) { DEBUG(3, ("could not open handle to NETLOGON pipe: %s\n", nt_errstr(status))); @@ -814,7 +821,7 @@ reconnect: goto reconnect; } - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (!NT_STATUS_IS_OK(status)) { DEBUG(2, ("dcerpc_netr_LogonControl failed: %s\n", nt_errstr(status))); @@ -936,7 +943,7 @@ static WERROR _winbind_LogonControl_REDISCOVER(struct pipes_struct *p, invalidate_cm_connection(domain); domain->conn.netlogon_force_reauth = true; status = cm_connect_netlogon(domain, &netlogon_pipe); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) { status = NT_STATUS_NO_LOGON_SERVERS; } @@ -1005,7 +1012,7 @@ static WERROR _winbind_LogonControl_TC_QUERY(struct pipes_struct *p, } status = cm_connect_netlogon(domain, &netlogon_pipe); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) { status = NT_STATUS_NO_LOGON_SERVERS; } @@ -1184,7 +1191,7 @@ static WERROR _winbind_LogonControl_TC_VERIFY(struct pipes_struct *p, reconnect: status = cm_connect_netlogon(domain, &netlogon_pipe); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) { status = NT_STATUS_NO_LOGON_SERVERS; } @@ -1404,7 +1411,7 @@ static WERROR _winbind_LogonControl_CHANGE_PASSWORD(struct pipes_struct *p, reconnect: status = cm_connect_netlogon(domain, &netlogon_pipe); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) { status = NT_STATUS_NO_LOGON_SERVERS; } @@ -1609,7 +1616,7 @@ WERROR _winbind_GetForestTrustInformation(struct pipes_struct *p, reconnect: status = cm_connect_netlogon(domain, &netlogon_pipe); - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); if (NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) { status = NT_STATUS_NO_LOGON_SERVERS; } diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h index 1edca1fee58..25fae5fe939 100644 --- a/source3/winbindd/winbindd_proto.h +++ b/source3/winbindd/winbindd_proto.h @@ -972,6 +972,7 @@ bool reconnect_need_retry(NTSTATUS status, struct winbindd_domain *domain); /* The following comes from winbindd/winbindd_dual_srv.c */ bool reset_cm_connection_on_error(struct winbindd_domain *domain, + struct dcerpc_binding_handle *b, NTSTATUS status); #endif /* _WINBINDD_PROTO_H_ */ diff --git a/source3/winbindd/winbindd_reconnect.c b/source3/winbindd/winbindd_reconnect.c index aa7cd12e8b4..1d0e8e6d472 100644 --- a/source3/winbindd/winbindd_reconnect.c +++ b/source3/winbindd/winbindd_reconnect.c @@ -69,7 +69,7 @@ bool reconnect_need_retry(NTSTATUS status, struct winbindd_domain *domain) return false; } - reset_cm_connection_on_error(domain, status); + reset_cm_connection_on_error(domain, NULL, status); return true; } |