diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 523d26f5e22e21e2f8228bcbd780f4ae0197e244..228315321fd099f83389500f5c39efaa8dd50356 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c @@ -2735,6 +2735,7 @@ int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u rv = 1; } else if (im) { if (src_addr) { + spin_lock_bh(&im->lock); for (psf = im->sources; psf; psf = psf->sf_next) { if (psf->sf_inaddr == src_addr) break; @@ -2745,6 +2746,7 @@ int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u im->sfcount[MCAST_EXCLUDE]; else rv = im->sfcount[MCAST_EXCLUDE] != 0; + spin_unlock_bh(&im->lock); } else rv = 1; /* unspecified source; tentatively allow */ }