struct sctp_endpoint *ep; 
void sctp_v4_err(struct sk_buff *skb, __u32 info){	struct iphdr *iph = (struct iphdr *)skb->data;	struct sctphdr *sh = (struct sctphdr *)(skb->data + (iph->ihl <<2));	int type = skb->h.icmph->type;	int code = skb->h.icmph->code;	struct sock *sk;	struct sctp_endpoint *ep;	struct sctp_association *asoc;	struct sctp_transport *transport;	struct inet_sock *inet;	char *saveip, *savesctp;	int err;	if (skb->len < ((iph->ihl << 2) + 8)) {		ICMP_INC_STATS_BH(ICMP_MIB_INERRORS);		return;	}	/* Fix up skb to look at the embedded net header. */	saveip = skb->nh.raw;	savesctp  = skb->h.raw;	skb->nh.iph = iph;	skb->h.raw = (char *)sh;	sk = sctp_err_lookup(AF_INET, skb, sh, &ep, &asoc, &transport);	/* Put back, the original pointers. */	skb->nh.raw = saveip;	skb->h.raw = savesctp;	if (!sk) {		ICMP_INC_STATS_BH(ICMP_MIB_INERRORS);		return;	}	/* Warning:  The sock lock is held.  Remember to call	 * sctp_err_finish!	 */	switch (type) {	case ICMP_PARAMETERPROB:		err = EPROTO;		break;	case ICMP_DEST_UNREACH:		if (code > NR_ICMP_UNREACH)			goto out_unlock;		/* PMTU discovery (RFC1191) */		if (ICMP_FRAG_NEEDED == code) {			sctp_icmp_frag_needed(sk, asoc, transport, info);			goto out_unlock;		}		else {			if (ICMP_PROT_UNREACH == code) {				sctp_icmp_proto_unreachable(sk, ep, asoc,							    transport);				goto out_unlock;			}		}		err = icmp_err_convert[code].errno;		break;	case ICMP_TIME_EXCEEDED:		/* Ignore any time exceeded errors due to fragment reassembly		 * timeouts.		 */		if (ICMP_EXC_FRAGTIME == code)			goto out_unlock;		err = EHOSTUNREACH;		break;	default:		goto out_unlock;	}	inet = inet_sk(sk);	if (!sock_owned_by_user(sk) && inet->recverr) {		sk->sk_err = err;		sk->sk_error_report(sk);	} else {  /* Only an error on timeout */		sk->sk_err_soft = err;	}out_unlock:	sctp_err_finish(sk, ep, asoc);}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/d1ad1ff299dd908d07c5e5f27f88bbdb235eb7a5/input.c/buggy/net/sctp/input.c