r21992: Fix keepalive processing when encryption turned on.
authorJeremy Allison <jra@samba.org>
Tue, 27 Mar 2007 21:55:43 +0000 (21:55 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:18:58 +0000 (12:18 -0500)
Jeremy.
(This used to be commit 8f113ad1918dcd2746ec527ceb79a2a7baa1d415)

source3/client/client.c
source3/libsmb/clientgen.c

index 481fca8f84d442a9261c5a48d2e00344e84f694f..b32e5baae6589d8453d6339836fe5fffef387aff 100644 (file)
@@ -3666,12 +3666,12 @@ static void readline_callback(void)
        timeout.tv_usec = 0;
        sys_select_intr(cli->fd+1,&fds,NULL,NULL,&timeout);
                
-       /* We deliberately use receive_smb instead of
+       /* We deliberately use cli_receive_smb_return_keepalive instead of
           client_receive_smb as we want to receive
           session keepalives and then drop them here.
        */
        if (FD_ISSET(cli->fd,&fds)) {
-               if (!receive_smb(cli->fd,cli->inbuf,0)) {
+               if (!cli_receive_smb_return_keepalive(cli)) {
                        DEBUG(0, ("Read from server failed, maybe it closed the "
                                "connection\n"));
                        return;
index fc88f7f1e2bb028eafc110970e221c9c81262503..b3c38f39ae563883ddbfc55dd1192cb7fb83d1d8 100644 (file)
@@ -48,13 +48,13 @@ int cli_set_port(struct cli_state *cli, int port)
  *MUST* be of size BUFFER_SIZE+SAFETY_MARGIN.
  The timeout is in milliseconds
 
- This is exactly the same as receive_smb except that it never returns
+ This is exactly the same as receive_smb except that it can be set to never return
  a session keepalive packet (just as receive_smb used to do).
  receive_smb was changed to return keepalives as the oplock processing means this call
  should never go into a blocking read.
 ****************************************************************************/
 
-static BOOL client_receive_smb(struct cli_state *cli)
+static BOOL client_receive_smb(struct cli_state *cli, BOOL eat_keepalives)
 {
        BOOL ret;
        int fd = cli->fd;
@@ -71,8 +71,10 @@ static BOOL client_receive_smb(struct cli_state *cli)
                }
 
                /* Ignore session keepalive packets. */
-               if(CVAL(buffer,0) != SMBkeepalive)
-                       break;
+               if (eat_keepalives && (CVAL(buffer,0) == SMBkeepalive)) {
+                       continue;
+               }
+               break;
        }
 
        if (cli_encryption_on(cli)) {
@@ -94,7 +96,7 @@ static BOOL client_receive_smb(struct cli_state *cli)
  Recv an smb.
 ****************************************************************************/
 
-BOOL cli_receive_smb(struct cli_state *cli)
+BOOL cli_receive_smb_internal(struct cli_state *cli, BOOL eat_keepalives)
 {
        BOOL ret;
 
@@ -103,7 +105,7 @@ BOOL cli_receive_smb(struct cli_state *cli)
                return False; 
 
  again:
-       ret = client_receive_smb(cli);
+       ret = client_receive_smb(cli, eat_keepalives);
        
        if (ret) {
                /* it might be an oplock break request */
@@ -142,6 +144,24 @@ BOOL cli_receive_smb(struct cli_state *cli)
        return True;
 }
 
+/****************************************************************************
+ Recv an smb - eat keepalives.
+****************************************************************************/
+
+BOOL cli_receive_smb(struct cli_state *cli)
+{
+       return cli_receive_smb_internal(cli, True);
+}
+
+/****************************************************************************
+ Recv an smb - return keepalives.
+****************************************************************************/
+
+BOOL cli_receive_smb_return_keepalive(struct cli_state *cli)
+{
+       return cli_receive_smb_internal(cli, False);
+}
+
 static ssize_t write_socket(int fd, const char *buf, size_t len)
 {
         ssize_t ret=0;