tcp: must unclone packets before mangling them
authorEric Dumazet <edumazet@google.com>
Tue, 15 Oct 2013 18:54:30 +0000 (11:54 -0700)
committerBen Hutchings <ben@decadent.org.uk>
Thu, 28 Nov 2013 14:01:56 +0000 (14:01 +0000)
commite5704e2706445e6fa20df4eb1017d8016f2e9a16
treec517002d3647a34664dadbb979560de2dfeaf68e
parent8b5ed99a4f9f2969c47501530da6dcd5a91f8f3d
tcp: must unclone packets before mangling them

[ Upstream commit c52e2421f7368fd36cbe330d2cf41b10452e39a9 ]

TCP stack should make sure it owns skbs before mangling them.

We had various crashes using bnx2x, and it turned out gso_size
was cleared right before bnx2x driver was populating TC descriptor
of the _previous_ packet send. TCP stack can sometime retransmit
packets that are still in Qdisc.

Of course we could make bnx2x driver more robust (using
ACCESS_ONCE(shinfo->gso_size) for example), but the bug is TCP stack.

We have identified two points where skb_unclone() was needed.

This patch adds a WARN_ON_ONCE() to warn us if we missed another
fix of this kind.

Kudos to Neal for finding the root cause of this bug. Its visible
using small MSS.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Cc: Yuchung Cheng <ycheng@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
include/linux/skbuff.h
net/ipv4/tcp_output.c