Skip to content

Commit cf8fbc6

Browse files
committed
Merge branch 'mptcp-fix-a-couple-of-races'
Paolo Abeni says: ==================== mptcp: fix a couple of races The first patch addresses a division by zero issue reported by Eric, the second one solves a similar issue found by code inspection while investigating the former. ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 102d140 + ce7356a commit cf8fbc6

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

net/mptcp/protocol.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2082,7 +2082,8 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied)
20822082
slow = lock_sock_fast(ssk);
20832083
WRITE_ONCE(ssk->sk_rcvbuf, rcvbuf);
20842084
WRITE_ONCE(tcp_sk(ssk)->window_clamp, window_clamp);
2085-
tcp_cleanup_rbuf(ssk, 1);
2085+
if (tcp_can_send_ack(ssk))
2086+
tcp_cleanup_rbuf(ssk, 1);
20862087
unlock_sock_fast(ssk, slow);
20872088
}
20882089
}
@@ -2205,7 +2206,7 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
22052206
cmsg_flags = MPTCP_CMSG_INQ;
22062207

22072208
while (copied < len) {
2208-
int bytes_read;
2209+
int err, bytes_read;
22092210

22102211
bytes_read = __mptcp_recvmsg_mskq(msk, msg, len - copied, flags, &tss, &cmsg_flags);
22112212
if (unlikely(bytes_read < 0)) {
@@ -2267,9 +2268,16 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
22672268
}
22682269

22692270
pr_debug("block timeout %ld\n", timeo);
2270-
sk_wait_data(sk, &timeo, NULL);
2271+
mptcp_rcv_space_adjust(msk, copied);
2272+
err = sk_wait_data(sk, &timeo, NULL);
2273+
if (err < 0) {
2274+
err = copied ? : err;
2275+
goto out_err;
2276+
}
22712277
}
22722278

2279+
mptcp_rcv_space_adjust(msk, copied);
2280+
22732281
out_err:
22742282
if (cmsg_flags && copied >= 0) {
22752283
if (cmsg_flags & MPTCP_CMSG_TS)
@@ -2285,8 +2293,6 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
22852293
pr_debug("msk=%p rx queue empty=%d:%d copied=%d\n",
22862294
msk, skb_queue_empty_lockless(&sk->sk_receive_queue),
22872295
skb_queue_empty(&msk->receive_queue), copied);
2288-
if (!(flags & MSG_PEEK))
2289-
mptcp_rcv_space_adjust(msk, copied);
22902296

22912297
release_sock(sk);
22922298
return copied;

0 commit comments

Comments
 (0)