kfree_skb(skb); } 
kfree_skb(skb); 
static inline int ip6_input_finish(struct sk_buff *skb){	struct inet6_protocol *ipprot;	struct sock *raw_sk;	unsigned int nhoff;	int nexthdr;	u8 hash;	skb->h.raw = skb->nh.raw + sizeof(struct ipv6hdr);	/*	 *	Parse extension headers	 */	nexthdr = skb->nh.ipv6h->nexthdr;	nhoff = offsetof(struct ipv6hdr, nexthdr);	/* Skip hop-by-hop options, they are already parsed. */	if (nexthdr == NEXTHDR_HOP) {		nhoff = sizeof(struct ipv6hdr);		nexthdr = skb->h.raw[0];		skb->h.raw += (skb->h.raw[1]+1)<<3;	}	rcu_read_lock();resubmit:	if (!pskb_pull(skb, skb->h.raw - skb->data))		goto discard;	nexthdr = skb->nh.raw[nhoff];	raw_sk = sk_head(&raw_v6_htable[nexthdr & (MAX_INET_PROTOS - 1)]);	if (raw_sk)		ipv6_raw_deliver(skb, nexthdr);	hash = nexthdr & (MAX_INET_PROTOS - 1);	if ((ipprot = rcu_dereference(inet6_protos[hash])) != NULL) {		int ret;				if (ipprot->flags & INET6_PROTO_FINAL) {			struct ipv6hdr *hdr;				skb_postpull_rcsum(skb, skb->nh.raw,					   skb->h.raw - skb->nh.raw);			hdr = skb->nh.ipv6h;			if (ipv6_addr_is_multicast(&hdr->daddr) &&			    !ipv6_chk_mcast_addr(skb->dev, &hdr->daddr,			    &hdr->saddr) &&			    !ipv6_is_mld(skb, nexthdr))				goto discard;		}		if (!(ipprot->flags & INET6_PROTO_NOPOLICY) &&		    !xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) 			goto discard;				ret = ipprot->handler(&skb, &nhoff);		if (ret > 0)			goto resubmit;		else if (ret == 0)			IP6_INC_STATS_BH(IPSTATS_MIB_INDELIVERS);	} else {		if (!raw_sk) {			if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {				IP6_INC_STATS_BH(IPSTATS_MIB_INUNKNOWNPROTOS);				icmpv6_param_prob(skb, ICMPV6_UNK_NEXTHDR, nhoff);			}		} else {			IP6_INC_STATS_BH(IPSTATS_MIB_INDELIVERS);			kfree_skb(skb);		}	}	rcu_read_unlock();	return 0;discard:	IP6_INC_STATS_BH(IPSTATS_MIB_INDISCARDS);	rcu_read_unlock();	kfree_skb(skb);	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/fad87acaea7b0965fe91f0351fdd688fc9761cbe/ip6_input.c/buggy/net/ipv6/ip6_input.c