s3: lib: libsmbclient: If reusing a server struct, check every cli->timout milisecond...
authorJeremy Allison <jra@samba.org>
Wed, 18 Mar 2015 21:15:16 +0000 (14:15 -0700)
committerDavid Disseldorp <ddiss@samba.org>
Fri, 20 Mar 2015 12:48:26 +0000 (13:48 +0100)
Uses an cli_echo() call to do so.

Based on code from <shargagan@novell.com>

Bug 11079 - libsmbclient not checking the cached connection alive status before re-using it from connection cache

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

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: David Disseldorp <ddiss@samba.org>
Autobuild-User(master): David Disseldorp <ddiss@samba.org>
Autobuild-Date(master): Fri Mar 20 13:48:26 CET 2015 on sn-devel-104

source3/include/libsmb_internal.h
source3/libsmb/libsmb_server.c

index ce73181facbf18b39a7cf1718f3f9e46ddde1939..65fad99892b67f11f5c581a88994a168c40ca58f 100644 (file)
@@ -81,6 +81,7 @@ struct _SMBCSRV {
        bool no_pathinfo3;
         bool no_nt_session;
         struct policy_handle pol;
+       time_t last_echo_time;
 
        SMBCSRV *next, *prev;
 };
index 8f68a4089598bf8f94399a990e81039788a9eb50..d6c25884ef0d9c42369ae3baa8d195ecbc1cc5be 100644 (file)
@@ -45,10 +45,26 @@ int
 SMBC_check_server(SMBCCTX * context,
                   SMBCSRV * server)
 {
+       time_t now;
+
        if (!cli_state_is_connected(server->cli)) {
                return 1;
        }
 
+       now = time_mono(NULL);
+
+       if (server->last_echo_time == (time_t)0 ||
+                       now > server->last_echo_time +
+                               (server->cli->timeout/1000)) {
+               unsigned char data[16] = {0};
+               NTSTATUS status = cli_echo(server->cli,
+                                       1,
+                                       data_blob_const(data, sizeof(data)));
+               if (!NT_STATUS_IS_OK(status)) {
+                       return 1;
+               }
+               server->last_echo_time = now;
+       }
        return 0;
 }