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)
committerJeremy Allison <jra@samba.org>
Tue, 23 Dec 2014 01:46:34 +0000 (02:46 +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

source3/winbindd/winbindd_dual_srv.c

index 108b201065ae8c880706cc118fcdf868e3c24a28..22e709fda90a2b672515e4d083751bb93faf3749 100644 (file)
@@ -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",