提交 1d39cd8c 编写于 作者: P Paolo Abeni 提交者: David S. Miller

mptcp: fix integer overflow in mptcp_subflow_discard_data()

Christoph reported an infinite loop in the subflow receive path
under stress condition.

If there are multiple subflows, each of them using a large send
buffer, the delta between the sequence number used by
MPTCP-level retransmission can and the current msk->ack_seq
can be greater than MAX_INT.

In the above scenario, when calling mptcp_subflow_discard_data(),
such delta will be truncated to int, and could result in a negative
number: no bytes will be dropped, and subflow_check_data_avail()
will try again to process the same packet, looping forever.

This change addresses the issue by expanding the 'limit' size to 64
bits, so that overflows are not possible anymore.

Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/87
Fixes: 6719331c ("mptcp: trigger msk processing even for OoO data")
Reported-and-tested-by: NChristoph Paasch <cpaasch@apple.com>
Signed-off-by: NPaolo Abeni <pabeni@redhat.com>
Reviewed-by: NMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 ac679364
...@@ -807,7 +807,7 @@ static enum mapping_status get_mapping_status(struct sock *ssk, ...@@ -807,7 +807,7 @@ static enum mapping_status get_mapping_status(struct sock *ssk,
} }
static void mptcp_subflow_discard_data(struct sock *ssk, struct sk_buff *skb, static void mptcp_subflow_discard_data(struct sock *ssk, struct sk_buff *skb,
unsigned int limit) u64 limit)
{ {
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
bool fin = TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN; bool fin = TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册