diff options
author | Julian Anastasov <ja@ssi.bg> | 2013-04-17 16:50:45 -0400 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2013-04-22 22:43:05 -0400 |
commit | d717bb2a9815f21ad962574daff821379f485ee3 (patch) | |
tree | 9ba8124685d345bb08215d9172c860ac0d347aac /net/netfilter | |
parent | 3e3251b3f289528732edab386ddf73ac428359b7 (diff) |
ipvs: properly dereference dest_dst in ip_vs_forget_dev
Use rcu_dereference_protected to resolve
sparse warning, found by kbuild test robot:
net/netfilter/ipvs/ip_vs_ctl.c:1464:35: warning: dereference of
noderef expression
Problem from commit 026ace060dfe29
("ipvs: optimize dst usage for real server")
Signed-off-by: Julian Anastasov <ja@ssi.bg>
Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'net/netfilter')
-rw-r--r-- | net/netfilter/ipvs/ip_vs_ctl.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 9e4074c26dc2..5a6544475b3c 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
@@ -1460,8 +1460,11 @@ void ip_vs_service_net_cleanup(struct net *net) | |||
1460 | static inline void | 1460 | static inline void |
1461 | ip_vs_forget_dev(struct ip_vs_dest *dest, struct net_device *dev) | 1461 | ip_vs_forget_dev(struct ip_vs_dest *dest, struct net_device *dev) |
1462 | { | 1462 | { |
1463 | struct ip_vs_dest_dst *dest_dst; | ||
1464 | |||
1463 | spin_lock_bh(&dest->dst_lock); | 1465 | spin_lock_bh(&dest->dst_lock); |
1464 | if (dest->dest_dst && dest->dest_dst->dst_cache->dev == dev) { | 1466 | dest_dst = rcu_dereference_protected(dest->dest_dst, 1); |
1467 | if (dest_dst && dest_dst->dst_cache->dev == dev) { | ||
1465 | IP_VS_DBG_BUF(3, "Reset dev:%s dest %s:%u ,dest->refcnt=%d\n", | 1468 | IP_VS_DBG_BUF(3, "Reset dev:%s dest %s:%u ,dest->refcnt=%d\n", |
1466 | dev->name, | 1469 | dev->name, |
1467 | IP_VS_DBG_ADDR(dest->af, &dest->addr), | 1470 | IP_VS_DBG_ADDR(dest->af, &dest->addr), |