diff options
author | Octavian Purdila <opurdila@ixiacom.com> | 2008-06-05 00:45:58 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-06-05 00:45:58 +0200 |
commit | 293ad60401da621b8b329abbe8c388edb25f658a (patch) | |
tree | fb2fdaf7721c8efa36b0b47f7b63d4e600217dbb /net/core/skbuff.c | |
parent | tcp: Increment OUTRSTS in tcp_send_active_reset() (diff) | |
download | linux-293ad60401da621b8b329abbe8c388edb25f658a.tar.xz linux-293ad60401da621b8b329abbe8c388edb25f658a.zip |
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>
Diffstat (limited to 'net/core/skbuff.c')
-rw-r--r-- | net/core/skbuff.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 5c459f2b7985..1e556d312117 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -1445,6 +1445,7 @@ done: if (spd.nr_pages) { int ret; + struct sock *sk = __skb->sk; /* * Drop the socket lock, otherwise we have reverse @@ -1455,9 +1456,9 @@ done: * we call into ->sendpage() with the i_mutex lock held * and networking will grab the socket lock. */ - release_sock(__skb->sk); + release_sock(sk); ret = splice_to_pipe(pipe, &spd); - lock_sock(__skb->sk); + lock_sock(sk); return ret; } |