diff options
Diffstat (limited to 'net/core/neighbour.c')
| -rw-r--r-- | net/core/neighbour.c | 12 | 
1 files changed, 9 insertions, 3 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 7bb6a9a1256..a16cf1ec5e5 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c @@ -834,12 +834,18 @@ static void neigh_timer_handler(unsigned long arg)  	}  	if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {  		struct sk_buff *skb = skb_peek(&neigh->arp_queue); - +		/* keep skb alive even if arp_queue overflows */ +		if (skb) +			skb_get(skb); +		write_unlock(&neigh->lock);  		neigh->ops->solicit(neigh, skb);  		atomic_inc(&neigh->probes); -	} +		if (skb) +			kfree_skb(skb); +	} else {  out: -	write_unlock(&neigh->lock); +		write_unlock(&neigh->lock); +	}  	if (notify)  		neigh_update_notify(neigh);  | 
