if (--iml->count) { rtnl_unlock(); if (in_dev) in_dev_put(in_dev); return 0; } 
int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr){	struct inet_sock *inet = inet_sk(sk);	struct ip_mc_socklist *iml, **imlp;	rtnl_lock();	for (imlp = &inet->mc_list; (iml = *imlp) != NULL; imlp = &iml->next) {		if (iml->multi.imr_multiaddr.s_addr==imr->imr_multiaddr.s_addr &&		    iml->multi.imr_address.s_addr==imr->imr_address.s_addr &&		    (!imr->imr_ifindex || iml->multi.imr_ifindex==imr->imr_ifindex)) {			struct in_device *in_dev;			in_dev = inetdev_by_index(iml->multi.imr_ifindex);			if (in_dev)				(void) ip_mc_leave_src(sk, iml, in_dev);			if (--iml->count) {				rtnl_unlock();				if (in_dev)					in_dev_put(in_dev);				return 0;			}			*imlp = iml->next;			if (in_dev) {				ip_mc_dec_group(in_dev, imr->imr_multiaddr.s_addr);				in_dev_put(in_dev);			}			rtnl_unlock();			sock_kfree_s(sk, iml, sizeof(*iml));			return 0;		}	}	rtnl_unlock();	return -EADDRNOTAVAIL;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/ca9b907d140a5f249250d19f956129dbbbf84f73/igmp.c/buggy/net/ipv4/igmp.c