Skip to content

Commit

Permalink
[CIFS] fix for incorrect session reconnects
Browse files Browse the repository at this point in the history
cifs reconnect could end up happening incorrectly due to
the small initial tcp recvmsg response. When the socket
was within three bytes of being full and the recvmsg
returned only 1 to 3 bytes of the initial 4 byte
read of the RFC1001 length field. Fortunately this
seems to be less common on more current kernels, but
this fixes it so cifs tries to retrieve all 4 bytes
of the initial tcp read.

Signed-off-by: Shirish Pargoankar <shirishp@us.ibm.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
  • Loading branch information
Steve French committed Aug 30, 2007
1 parent 8594c15 commit f01d5e1
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions fs/cifs/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -400,9 +400,11 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
iov.iov_len = 4;
smb_msg.msg_control = NULL;
smb_msg.msg_controllen = 0;
pdu_length = 4; /* enough to get RFC1001 header */
incomplete_rcv:
length =
kernel_recvmsg(csocket, &smb_msg,
&iov, 1, 4, 0 /* BB see socket.h flags */);
&iov, 1, pdu_length, 0 /* BB other flags? */);

if ( kthread_should_stop() ) {
break;
Expand Down Expand Up @@ -437,13 +439,12 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
wake_up(&server->response_q);
continue;
} else if (length < 4) {
cFYI(1,
("Frame under four bytes received (%d bytes long)",
cFYI(1, ("less than four bytes received (%d bytes)",
length));
pdu_length -= length;
cifs_reconnect(server);
csocket = server->ssocket;
wake_up(&server->response_q);
continue;
msleep(1);
goto incomplete_rcv;
}

/* The right amount was read from socket - 4 bytes */
Expand Down

0 comments on commit f01d5e1

Please sign in to comment.