Skip to content

Commit f745a3e

Browse files
Paolo Abenikuba-moo
Paolo Abeni
authored andcommitted
mptcp: consistent map handling on failure
When the MPTCP receive path reach a non fatal fall-back condition, e.g. when the MPC sockets must fall-back to TCP, the existing code is a little self-inconsistent: it reports that new data is available - return true - but sets the MPC flag to the opposite value. As the consequence read operations in some exceptional scenario may block unexpectedly. Address the issue setting the correct MPC read status. Additionally avoid some code duplication in the fatal fall-back scenario. Fixes: 9c81be0 ("mptcp: add MP_FAIL response support") Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent d51991e commit f745a3e

File tree

1 file changed

+9
-10
lines changed

1 file changed

+9
-10
lines changed

net/mptcp/subflow.c

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,28 +1252,27 @@ static bool subflow_check_data_avail(struct sock *ssk)
12521252
subflow->send_mp_fail = 1;
12531253

12541254
if (!READ_ONCE(msk->allow_infinite_fallback)) {
1255-
ssk->sk_err = EBADMSG;
1256-
tcp_set_state(ssk, TCP_CLOSE);
12571255
subflow->reset_transient = 0;
12581256
subflow->reset_reason = MPTCP_RST_EMIDDLEBOX;
1259-
tcp_send_active_reset(ssk, GFP_ATOMIC);
1260-
while ((skb = skb_peek(&ssk->sk_receive_queue)))
1261-
sk_eat_skb(ssk, skb);
1262-
} else {
1263-
mptcp_subflow_fail(msk, ssk);
1257+
goto reset;
12641258
}
1265-
WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
1259+
mptcp_subflow_fail(msk, ssk);
1260+
WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_DATA_AVAIL);
12661261
return true;
12671262
}
12681263

12691264
if (!subflow_can_fallback(subflow) && subflow->map_data_len) {
12701265
/* fatal protocol error, close the socket.
12711266
* subflow_error_report() will introduce the appropriate barriers
12721267
*/
1273-
ssk->sk_err = EBADMSG;
1274-
tcp_set_state(ssk, TCP_CLOSE);
12751268
subflow->reset_transient = 0;
12761269
subflow->reset_reason = MPTCP_RST_EMPTCP;
1270+
1271+
reset:
1272+
ssk->sk_err = EBADMSG;
1273+
tcp_set_state(ssk, TCP_CLOSE);
1274+
while ((skb = skb_peek(&ssk->sk_receive_queue)))
1275+
sk_eat_skb(ssk, skb);
12771276
tcp_send_active_reset(ssk, GFP_ATOMIC);
12781277
WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
12791278
return false;

0 commit comments

Comments
 (0)