diff options
Diffstat (limited to 'net/mptcp/protocol.c')
| -rw-r--r-- | net/mptcp/protocol.c | 24 | 
1 files changed, 21 insertions, 3 deletions
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index c2317919fc14..6d0e201c3eb2 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -620,6 +620,18 @@ static bool mptcp_check_data_fin(struct sock *sk)  	return ret;  } +static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk) +{ +	if (READ_ONCE(msk->allow_infinite_fallback)) { +		MPTCP_INC_STATS(sock_net(ssk), +				MPTCP_MIB_DSSCORRUPTIONFALLBACK); +		mptcp_do_fallback(ssk); +	} else { +		MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DSSCORRUPTIONRESET); +		mptcp_subflow_reset(ssk); +	} +} +  static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk,  					   struct sock *ssk,  					   unsigned int *bytes) @@ -692,10 +704,16 @@ static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk,  				moved += len;  			seq += len; -			if (WARN_ON_ONCE(map_remaining < len)) -				break; +			if (unlikely(map_remaining < len)) { +				DEBUG_NET_WARN_ON_ONCE(1); +				mptcp_dss_corruption(msk, ssk); +			}  		} else { -			WARN_ON_ONCE(!fin); +			if (unlikely(!fin)) { +				DEBUG_NET_WARN_ON_ONCE(1); +				mptcp_dss_corruption(msk, ssk); +			} +  			sk_eat_skb(ssk, skb);  			done = true;  		}  | 
