diff options
| author | 2008-06-10 02:22:26 -0700 | |
|---|---|---|
| committer | 2008-06-10 02:22:26 -0700 | |
| commit | 65b53e4cc90e59936733b3b95b9451d2ca47528d (patch) | |
| tree | 29932718192962671c48c3fd1ea017a6112459e8 /net/ipv4/tcp.c | |
| parent | Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/linville/wireless-next-2.6 (diff) | |
| parent | ipv6 netns: init net is used to set bindv6only for new sock (diff) | |
| download | wireguard-linux-65b53e4cc90e59936733b3b95b9451d2ca47528d.tar.xz wireguard-linux-65b53e4cc90e59936733b3b95b9451d2ca47528d.zip | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/tg3.c
drivers/net/wireless/rt2x00/rt2x00dev.c
net/mac80211/ieee80211_i.h
Diffstat (limited to 'net/ipv4/tcp.c')
| -rw-r--r-- | net/ipv4/tcp.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index f88653138621..ab66683b8043 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -1227,7 +1227,14 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, copied += used; offset += used; } - if (offset != skb->len) + /* + * If recv_actor drops the lock (e.g. TCP splice + * receive) the skb pointer might be invalid when + * getting here: tcp_collapse might have deleted it + * while aggregating skbs from the socket queue. + */ + skb = tcp_recv_skb(sk, seq-1, &offset); + if (!skb || (offset+1 != skb->len)) break; } if (tcp_hdr(skb)->fin) { |
