Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c527c8a7 authored by Steve French's avatar Steve French
Browse files

[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: default avatarShirish Pargaonkar <shirishp@us.ibm.com>
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent a75952b7
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -417,9 +417,14 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
			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) {