summaryrefslogtreecommitdiff
path: root/source3/winbindd/winbindd_dual_srv.c
diff options
context:
space:
mode:
authorChristof Schmitt <cs@samba.org>2014-12-22 15:19:47 -0800
committerJeremy Allison <jra@samba.org>2014-12-23 02:46:34 +0100
commit2fdc55160309cec89aeb88243cb18d058c67e918 (patch)
treefc71df906e765189e2cb2a54f9e4e879269d31be /source3/winbindd/winbindd_dual_srv.c
parente4213512d0a967e87a74a1ae816c903fb38dd8b9 (diff)
downloadsamba-2fdc55160309cec89aeb88243cb18d058c67e918.tar.gz
winbind: Retry LogonControl RPC in ping-dc after session expiration
When the underlying session expires, the LogonControl RPC call used in ping-dc returns NT_STATUS_IO_DEVICE_ERROR. Retry once in this case, instead of returning the error to the caller. Signed-off-by: Christof Schmitt <cs@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> Autobuild-User(master): Jeremy Allison <jra@samba.org> Autobuild-Date(master): Tue Dec 23 02:46:34 CET 2014 on sn-devel-104
Diffstat (limited to 'source3/winbindd/winbindd_dual_srv.c')
-rw-r--r--source3/winbindd/winbindd_dual_srv.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/source3/winbindd/winbindd_dual_srv.c b/source3/winbindd/winbindd_dual_srv.c
index 108b201065a..22e709fda90 100644
--- a/source3/winbindd/winbindd_dual_srv.c
+++ b/source3/winbindd/winbindd_dual_srv.c
@@ -668,12 +668,14 @@ NTSTATUS _wbint_PingDc(struct pipes_struct *p, struct wbint_PingDc *r)
WERROR werr;
fstring logon_server;
struct dcerpc_binding_handle *b;
+ bool retry = false;
domain = wb_child_domain();
if (domain == NULL) {
return NT_STATUS_REQUEST_NOT_ACCEPTED;
}
+reconnect:
status = cm_connect_netlogon(domain, &netlogon_pipe);
reset_cm_connection_on_error(domain, status);
if (!NT_STATUS_IS_OK(status)) {
@@ -701,6 +703,14 @@ NTSTATUS _wbint_PingDc(struct pipes_struct *p, struct wbint_PingDc *r)
logon_server, NETLOGON_CONTROL_QUERY,
2, &info, &werr);
+ if (NT_STATUS_EQUAL(status, NT_STATUS_IO_DEVICE_ERROR) && !retry) {
+ DEBUG(10, ("Session might have expired. "
+ "Reconnect and retry once.\n"));
+ invalidate_cm_connection(domain);
+ retry = true;
+ goto reconnect;
+ }
+
reset_cm_connection_on_error(domain, status);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(2, ("dcerpc_netr_LogonControl failed: %s\n",