diff options
| author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-11-08 06:15:54 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-11-09 11:26:42 -0500 |
| commit | 18943d292facbc70e6a36fc62399ae833f64671b (patch) | |
| tree | 337c4818e0cb478a4436ee5ad8d16822998bf8eb | |
| parent | aa58163a76a3aef33c7220931543d45d0fe43753 (diff) | |
inet: fix ip_mc_drop_socket()
commit 8723e1b4ad9be4444 (inet: RCU changes in inetdev_by_index())
forgot one call site in ip_mc_drop_socket()
We should not decrease idev refcount after inetdev_by_index() call,
since refcount is not increased anymore.
Reported-by: Markus Trippelsdorf <markus@trippelsdorf.de>
Reported-by: Miles Lane <miles.lane@gmail.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/ipv4/igmp.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index c8877c6c7216..3c53c2d89e3b 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
| @@ -2306,10 +2306,8 @@ void ip_mc_drop_socket(struct sock *sk) | |||
| 2306 | 2306 | ||
| 2307 | in_dev = inetdev_by_index(net, iml->multi.imr_ifindex); | 2307 | in_dev = inetdev_by_index(net, iml->multi.imr_ifindex); |
| 2308 | (void) ip_mc_leave_src(sk, iml, in_dev); | 2308 | (void) ip_mc_leave_src(sk, iml, in_dev); |
| 2309 | if (in_dev != NULL) { | 2309 | if (in_dev != NULL) |
| 2310 | ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr); | 2310 | ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr); |
| 2311 | in_dev_put(in_dev); | ||
| 2312 | } | ||
| 2313 | /* decrease mem now to avoid the memleak warning */ | 2311 | /* decrease mem now to avoid the memleak warning */ |
| 2314 | atomic_sub(sizeof(*iml), &sk->sk_omem_alloc); | 2312 | atomic_sub(sizeof(*iml), &sk->sk_omem_alloc); |
| 2315 | call_rcu(&iml->rcu, ip_mc_socklist_reclaim); | 2313 | call_rcu(&iml->rcu, ip_mc_socklist_reclaim); |
