summaryrefslogtreecommitdiffstats
path: root/net/ipv4/ip_fragment.c
diff options
context:
space:
mode:
authorPavel Emelyanov2008-06-28 05:06:08 +0200
committerDavid S. Miller2008-06-28 05:06:08 +0200
commit9a375803feaadb6c34e0807bd9325885dcca5c00 (patch)
treefba3b0835d1fb3211da1c1be9dd6d4508e6668a6 /net/ipv4/ip_fragment.c
parentCONNECTOR: add a proc entry to list connectors (diff)
downloadkernel-qcow2-linux-9a375803feaadb6c34e0807bd9325885dcca5c00.tar.gz
kernel-qcow2-linux-9a375803feaadb6c34e0807bd9325885dcca5c00.tar.xz
kernel-qcow2-linux-9a375803feaadb6c34e0807bd9325885dcca5c00.zip
inet fragments: fix race between inet_frag_find and inet_frag_secret_rebuild
The problem is that while we work w/o the inet_frags.lock even read-locked the secret rebuild timer may occur (on another CPU, since BHs are still disabled in the inet_frag_find) and change the rnd seed for ipv4/6 fragments. It was caused by my patch fd9e63544cac30a34c951f0ec958038f0529e244 ([INET]: Omit double hash calculations in xxx_frag_intern) late in the 2.6.24 kernel, so this should probably be queued to -stable. Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/ip_fragment.c')
-rw-r--r--net/ipv4/ip_fragment.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c
index cd6ce6ac6358..37221f659159 100644
--- a/net/ipv4/ip_fragment.c
+++ b/net/ipv4/ip_fragment.c
@@ -229,6 +229,8 @@ static inline struct ipq *ip_find(struct net *net, struct iphdr *iph, u32 user)
arg.iph = iph;
arg.user = user;
+
+ read_lock(&ip4_frags.lock);
hash = ipqhashfn(iph->id, iph->saddr, iph->daddr, iph->protocol);
q = inet_frag_find(&net->ipv4.frags, &ip4_frags, &arg, hash);