From: Steve French Date: Mon, 3 Nov 2008 20:46:21 +0000 (+0000) Subject: [CIFS] Can't rely on iov length and base when kernel_recvmsg returns error X-Git-Tag: v2.6.28-rc6~58^2~11 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=c527c8a7ffa18400c2c1488f7ab5aff5e83f3c8e;p=linux-2.6-omap-h63xx.git [CIFS] Can't rely on iov length and base when kernel_recvmsg returns error When retrying kernel_recvmsg, reset iov_base and iov_len. Note comment from Sridhar: "In the normal path, iov.iov_len is clearly set to 4. But i think you are running into a case where kernel_recvmsg() is called via 'goto incomplete_rcv' It happens if the previous call fails with EAGAIN. If you want to call recvmsg() after EAGAIN failure, you need to reset iov." Signed-off-by: Shirish Pargaonkar Signed-off-by: Steve French --- diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index e9f9248cb3f..c682be8f298 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -417,9 +417,14 @@ incomplete_rcv: msleep(1); /* minimum sleep to prevent looping allowing socket to clear and app threads to set tcpStatus CifsNeedReconnect if server hung */ - if (pdu_length < 4) + if (pdu_length < 4) { + iov.iov_base = (4 - pdu_length) + + (char *)smb_buffer; + iov.iov_len = pdu_length; + smb_msg.msg_control = NULL; + smb_msg.msg_controllen = 0; goto incomplete_rcv; - else + } else continue; } else if (length <= 0) { if (server->tcpStatus == CifsNew) {