Commit b9fe5f60 authored by Paolo Abeni's avatar Paolo Abeni Committed by Wen Zhiwei
Browse files

mptcp: fix recvbuffer adjust on sleeping rcvmsg

stable inclusion
from stable-v6.6.70
commit 27c843e7644725203e3be7a0260f0d4fac51f906
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IBOHV1

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=27c843e7644725203e3be7a0260f0d4fac51f906



--------------------------------

commit 449e6912a2522af672e99992e1201a454910864e upstream.

If the recvmsg() blocks after receiving some data - i.e. due to
SO_RCVLOWAT - the MPTCP code will attempt multiple times to
adjust the receive buffer size, wrongly accounting every time the
cumulative of received data - instead of accounting only for the
delta.

Address the issue moving mptcp_rcv_space_adjust just after the
data reception and passing it only the just received bytes.

This also removes an unneeded difference between the TCP and MPTCP
RX code path implementation.

Fixes: 581302298524 ("mptcp: error out earlier on disconnect")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Reviewed-by: default avatarMat Martineau <martineau@kernel.org>
Signed-off-by: default avatarMatthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20241230-net-mptcp-rbuf-fixes-v1-1-8608af434ceb@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarWen Zhiwei <wenzhiwei@kylinos.cn>
parent 3b1967c2
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1934,6 +1934,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
	goto out;
}

static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied);

static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk,
				struct msghdr *msg,
				size_t len, int flags,
@@ -1987,6 +1989,7 @@ static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk,
			break;
	}

	mptcp_rcv_space_adjust(msk, copied);
	return copied;
}

@@ -2263,7 +2266,6 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
		}

		pr_debug("block timeout %ld\n", timeo);
		mptcp_rcv_space_adjust(msk, copied);
		err = sk_wait_data(sk, &timeo, NULL);
		if (err < 0) {
			err = copied ? : err;
@@ -2271,8 +2273,6 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
		}
	}

	mptcp_rcv_space_adjust(msk, copied);

out_err:
	if (cmsg_flags && copied >= 0) {
		if (cmsg_flags & MPTCP_CMSG_TS)