err = datagram_send_ctl(&msg, &flowi, fl->opt, &junk); 
err = datagram_send_ctl(&msg, &flowi, fl->opt, &junk, &junk); 
fl_create(struct in6_flowlabel_req *freq, char __user *optval, int optlen, int *err_p){	struct ip6_flowlabel *fl;	int olen;	int addr_type;	int err;	err = -ENOMEM;	fl = kmalloc(sizeof(*fl), GFP_KERNEL);	if (fl == NULL)		goto done;	memset(fl, 0, sizeof(*fl));	olen = optlen - CMSG_ALIGN(sizeof(*freq));	if (olen > 0) {		struct msghdr msg;		struct flowi flowi;		int junk;		err = -ENOMEM;		fl->opt = kmalloc(sizeof(*fl->opt) + olen, GFP_KERNEL);		if (fl->opt == NULL)			goto done;		memset(fl->opt, 0, sizeof(*fl->opt));		fl->opt->tot_len = sizeof(*fl->opt) + olen;		err = -EFAULT;		if (copy_from_user(fl->opt+1, optval+CMSG_ALIGN(sizeof(*freq)), olen))			goto done;		msg.msg_controllen = olen;		msg.msg_control = (void*)(fl->opt+1);		flowi.oif = 0;		err = datagram_send_ctl(&msg, &flowi, fl->opt, &junk);		if (err)			goto done;		err = -EINVAL;		if (fl->opt->opt_flen)			goto done;		if (fl->opt->opt_nflen == 0) {			kfree(fl->opt);			fl->opt = NULL;		}	}	fl->expires = jiffies;	err = fl6_renew(fl, freq->flr_linger, freq->flr_expires);	if (err)		goto done;	fl->share = freq->flr_share;	addr_type = ipv6_addr_type(&freq->flr_dst);	if ((addr_type&IPV6_ADDR_MAPPED)	    || addr_type == IPV6_ADDR_ANY)		goto done;	ipv6_addr_copy(&fl->dst, &freq->flr_dst);	atomic_set(&fl->users, 1);	switch (fl->share) {	case IPV6_FL_S_EXCL:	case IPV6_FL_S_ANY:		break;	case IPV6_FL_S_PROCESS:		fl->owner = current->pid;		break;	case IPV6_FL_S_USER:		fl->owner = current->euid;		break;	default:		err = -EINVAL;		goto done;	}	return fl;done:	fl_free(fl);	*err_p = err;	return NULL;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/41a1f8ea4fbfcdc4232f023732584aae2220de31/ip6_flowlabel.c/buggy/net/ipv6/ip6_flowlabel.c