diff options
| author | Gao feng <gaofeng@cn.fujitsu.com> | 2011-09-11 15:36:05 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-09-21 15:16:40 -0400 | 
| commit | 561dac2d410ffac0b57a23b85ae0a623c1a076ca (patch) | |
| tree | 5cdb1bf0e346f29f232b7b7fb9cf24211141502e /net/core/fib_rules.c | |
| parent | b811ce9104a7f7663ddae4f7795a194a103b8f90 (diff) | |
| download | olio-linux-3.10-561dac2d410ffac0b57a23b85ae0a623c1a076ca.tar.xz olio-linux-3.10-561dac2d410ffac0b57a23b85ae0a623c1a076ca.zip  | |
fib:fix BUG_ON in fib_nl_newrule when add new fib rule
add new fib rule can cause BUG_ON happen
the reproduce shell is
ip rule add pref 38
ip rule add pref 38
ip rule add to 192.168.3.0/24 goto 38
ip rule del pref 38
ip rule add to 192.168.3.0/24 goto 38
ip rule add pref 38
then the BUG_ON will happen
del BUG_ON and use (ctarget == NULL) identify whether this rule is unresolved
Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/fib_rules.c')
| -rw-r--r-- | net/core/fib_rules.c | 4 | 
1 files changed, 2 insertions, 2 deletions
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index e7ab0c0285b..3231b468bb7 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c @@ -384,8 +384,8 @@ static int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)  		 */  		list_for_each_entry(r, &ops->rules_list, list) {  			if (r->action == FR_ACT_GOTO && -			    r->target == rule->pref) { -				BUG_ON(rtnl_dereference(r->ctarget) != NULL); +			    r->target == rule->pref && +			    rtnl_dereference(r->ctarget) == NULL) {  				rcu_assign_pointer(r->ctarget, rule);  				if (--ops->unresolved_rules == 0)  					break;  |