mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 09:33:31 +02:00
Merge branch 'mptcp-fix-warn-on-bad-status'
Matthieu Baerts says: ==================== mptcp: fix warn on bad status Two somewhat related fixes addressing different issues found by syzkaller, and producing the exact same splat: a WARNING in subflow_data_ready(). - Patch 1: fallback earlier on simultaneous connections to avoid a warning. A fix for v5.19. - Patch 2: ensure context reset on disconnect, also to avoid a similar warning. A fix for v6.2. Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> ==================== Link: https://patch.msgid.link/20251212-net-mptcp-subflow_data_ready-warn-v1-0-d1f9fd1c36c8@kernel.org Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
commit
350719c383
|
|
@ -408,6 +408,16 @@ bool mptcp_syn_options(struct sock *sk, const struct sk_buff *skb,
|
|||
*/
|
||||
subflow->snd_isn = TCP_SKB_CB(skb)->end_seq;
|
||||
if (subflow->request_mptcp) {
|
||||
if (unlikely(subflow_simultaneous_connect(sk))) {
|
||||
WARN_ON_ONCE(!mptcp_try_fallback(sk, MPTCP_MIB_SIMULTCONNFALLBACK));
|
||||
|
||||
/* Ensure mptcp_finish_connect() will not process the
|
||||
* MPC handshake.
|
||||
*/
|
||||
subflow->request_mptcp = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
opts->suboptions = OPTION_MPTCP_MPC_SYN;
|
||||
opts->csum_reqd = mptcp_is_checksum_enabled(sock_net(sk));
|
||||
opts->allow_join_id0 = mptcp_allow_join_id0(sock_net(sk));
|
||||
|
|
|
|||
|
|
@ -2467,10 +2467,10 @@ bool __mptcp_retransmit_pending_data(struct sock *sk)
|
|||
*/
|
||||
static void __mptcp_subflow_disconnect(struct sock *ssk,
|
||||
struct mptcp_subflow_context *subflow,
|
||||
unsigned int flags)
|
||||
bool fastclosing)
|
||||
{
|
||||
if (((1 << ssk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN)) ||
|
||||
subflow->send_fastclose) {
|
||||
fastclosing) {
|
||||
/* The MPTCP code never wait on the subflow sockets, TCP-level
|
||||
* disconnect should never fail
|
||||
*/
|
||||
|
|
@ -2538,7 +2538,7 @@ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
|
|||
|
||||
need_push = (flags & MPTCP_CF_PUSH) && __mptcp_retransmit_pending_data(sk);
|
||||
if (!dispose_it) {
|
||||
__mptcp_subflow_disconnect(ssk, subflow, flags);
|
||||
__mptcp_subflow_disconnect(ssk, subflow, msk->fastclosing);
|
||||
release_sock(ssk);
|
||||
|
||||
goto out;
|
||||
|
|
@ -2884,6 +2884,7 @@ static void mptcp_do_fastclose(struct sock *sk)
|
|||
|
||||
mptcp_set_state(sk, TCP_CLOSE);
|
||||
mptcp_backlog_purge(sk);
|
||||
msk->fastclosing = 1;
|
||||
|
||||
/* Explicitly send the fastclose reset as need */
|
||||
if (__mptcp_check_fallback(msk))
|
||||
|
|
@ -3418,6 +3419,7 @@ static int mptcp_disconnect(struct sock *sk, int flags)
|
|||
msk->bytes_sent = 0;
|
||||
msk->bytes_retrans = 0;
|
||||
msk->rcvspace_init = 0;
|
||||
msk->fastclosing = 0;
|
||||
|
||||
/* for fallback's sake */
|
||||
WRITE_ONCE(msk->ack_seq, 0);
|
||||
|
|
|
|||
|
|
@ -320,7 +320,8 @@ struct mptcp_sock {
|
|||
fastopening:1,
|
||||
in_accept_queue:1,
|
||||
free_first:1,
|
||||
rcvspace_init:1;
|
||||
rcvspace_init:1,
|
||||
fastclosing:1;
|
||||
u32 notsent_lowat;
|
||||
int keepalive_cnt;
|
||||
int keepalive_idle;
|
||||
|
|
@ -1337,10 +1338,8 @@ static inline bool subflow_simultaneous_connect(struct sock *sk)
|
|||
{
|
||||
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
|
||||
|
||||
return (1 << sk->sk_state) &
|
||||
(TCPF_ESTABLISHED | TCPF_FIN_WAIT1 | TCPF_FIN_WAIT2 | TCPF_CLOSING) &&
|
||||
is_active_ssk(subflow) &&
|
||||
!subflow->conn_finished;
|
||||
/* Note that the sk state implies !subflow->conn_finished. */
|
||||
return sk->sk_state == TCP_SYN_RECV && is_active_ssk(subflow);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SYN_COOKIES
|
||||
|
|
|
|||
|
|
@ -1878,12 +1878,6 @@ static void subflow_state_change(struct sock *sk)
|
|||
|
||||
__subflow_state_change(sk);
|
||||
|
||||
if (subflow_simultaneous_connect(sk)) {
|
||||
WARN_ON_ONCE(!mptcp_try_fallback(sk, MPTCP_MIB_SIMULTCONNFALLBACK));
|
||||
subflow->conn_finished = 1;
|
||||
mptcp_propagate_state(parent, sk, subflow, NULL);
|
||||
}
|
||||
|
||||
/* as recvmsg() does not acquire the subflow socket for ssk selection
|
||||
* a fin packet carrying a DSS can be unnoticed if we don't trigger
|
||||
* the data available machinery here.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user