winbind: Retry LogonControl RPC in ping-dc after session expiration
authorChristof Schmitt <cs@samba.org>
Mon, 22 Dec 2014 23:19:47 +0000 (15:19 -0800)
committerKarolin Seeger <kseeger@samba.org>
Sun, 11 Jan 2015 13:04:10 +0000 (14:04 +0100)
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
(cherry picked from commit 2fdc55160309cec89aeb88243cb18d058c67e918)

BUG: https://bugzilla.samba.org/show_bug.cgi?id=11034

source3/winbindd/winbindd_dual_srv.c

index 4227d6a9a1bf4375325124591f0e9639f7a42eff..2a78bd5b98ce3c40566d2a402a4568d3b134bc92 100644 (file)
@@ -687,12 +687,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)) {
@@ -719,6 +721,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->conn);
+               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",