if (f) kfree(f); 
kfree(f); 
static int route4_change(struct tcf_proto *tp, unsigned long base,		       u32 handle,		       struct rtattr **tca,		       unsigned long *arg){	struct route4_head *head = tp->root;	struct route4_filter *f, *f1, **fp;	struct route4_bucket *b;	struct rtattr *opt = tca[TCA_OPTIONS-1];	struct rtattr *tb[TCA_ROUTE4_MAX];	unsigned int h, th;	u32 old_handle = 0;	int err;	if (opt == NULL)		return handle ? -EINVAL : 0;	if (rtattr_parse_nested(tb, TCA_ROUTE4_MAX, opt) < 0)		return -EINVAL;	if ((f = (struct route4_filter*)*arg) != NULL) {		if (f->handle != handle && handle)			return -EINVAL;		if (f->bkt)			old_handle = f->handle;		err = route4_set_parms(tp, base, f, handle, head, tb,			tca[TCA_RATE-1], 0);		if (err < 0)			return err;		goto reinsert;	}	err = -ENOBUFS;	if (head == NULL) {		head = kmalloc(sizeof(struct route4_head), GFP_KERNEL);		if (head == NULL)			goto errout;		memset(head, 0, sizeof(struct route4_head));		tcf_tree_lock(tp);		tp->root = head;		tcf_tree_unlock(tp);	}	f = kmalloc(sizeof(struct route4_filter), GFP_KERNEL);	if (f == NULL)		goto errout;	memset(f, 0, sizeof(*f));	err = route4_set_parms(tp, base, f, handle, head, tb,		tca[TCA_RATE-1], 1);	if (err < 0)		goto errout;reinsert:	h = from_hash(f->handle >> 16);	for (fp = &f->bkt->ht[h]; (f1=*fp) != NULL; fp = &f1->next)		if (f->handle < f1->handle)			break;	f->next = f1;	tcf_tree_lock(tp);	*fp = f;	if (old_handle && f->handle != old_handle) {		th = to_hash(old_handle);		h = from_hash(old_handle >> 16);		if ((b = head->table[th]) != NULL) {			for (fp = &b->ht[h]; *fp; fp = &(*fp)->next) {				if (*fp == f) {					*fp = f->next;					break;				}			}		}	}	tcf_tree_unlock(tp);	route4_reset_fastmap(tp->q->dev, head, f->id);	*arg = (unsigned long)f;	return 0;errout:	if (f)		kfree(f);	return err;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/a51482bde22f99c63fbbb57d5d46cc666384e379/cls_route.c/buggy/net/sched/cls_route.c