tcp: Fix for race due to temporary drop of the socket lock in skb_splice_bits.
authorOctavian Purdila <opurdila@ixiacom.com>
Wed, 4 Jun 2008 22:45:58 +0000 (15:45 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 4 Jun 2008 22:45:58 +0000 (15:45 -0700)
commit293ad60401da621b8b329abbe8c388edb25f658a
treefb2fdaf7721c8efa36b0b47f7b63d4e600217dbb
parent26af65cbeb2467a486ae4fc7242c94e470c67c50
tcp: Fix for race due to temporary drop of the socket lock in skb_splice_bits.

skb_splice_bits temporary drops the socket lock while iterating over
the socket queue in order to break a reverse locking condition which
happens with sendfile. This, however, opens a window of opportunity
for tcp_collapse() to aggregate skbs and thus potentially free the
current skb used in skb_splice_bits and tcp_read_sock.

This patch fixes the problem by (re-)getting the same "logical skb"
after the lock has been temporary dropped.

Based on idea and initial patch from Evgeniy Polyakov.

Signed-off-by: Octavian Purdila <opurdila@ixiacom.com>
Acked-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/skbuff.c
net/ipv4/tcp.c