]> err.no Git - linux-2.6/commitdiff
[NET]: Fix race in generic address resolution.
authorFrank Blaschka <frank.blaschka@de.ibm.com>
Mon, 3 Mar 2008 20:16:04 +0000 (12:16 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 Mar 2008 20:16:04 +0000 (12:16 -0800)
neigh_update sends skb from neigh->arp_queue while neigh_timer_handler
has increased skbs refcount and calls solicit with the
skb. neigh_timer_handler should not increase skbs refcount but make a
copy of the skb and do solicit with the copy.

Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/neighbour.c

index aef01533dfb6ca2ed6dbc636ba58dc4ca490492d..d9a02b2cc28940d1dde4f5f7ee6064f9581b046b 100644 (file)
@@ -839,7 +839,7 @@ static void neigh_timer_handler(unsigned long arg)
                struct sk_buff *skb = skb_peek(&neigh->arp_queue);
                /* keep skb alive even if arp_queue overflows */
                if (skb)
-                       skb_get(skb);
+                       skb = skb_copy(skb, GFP_ATOMIC);
                write_unlock(&neigh->lock);
                neigh->ops->solicit(neigh, skb);
                atomic_inc(&neigh->probes);