if (f) kfree(f); 
kfree(f); 
static int fw_change(struct tcf_proto *tp, unsigned long base,		     u32 handle,		     struct rtattr **tca,		     unsigned long *arg){	struct fw_head *head = (struct fw_head*)tp->root;	struct fw_filter *f = (struct fw_filter *) *arg;	struct rtattr *opt = tca[TCA_OPTIONS-1];	struct rtattr *tb[TCA_FW_MAX];	int err;	if (!opt)		return handle ? -EINVAL : 0;	if (rtattr_parse_nested(tb, TCA_FW_MAX, opt) < 0)		return -EINVAL;	if (f != NULL) {		if (f->id != handle && handle)			return -EINVAL;		return fw_change_attrs(tp, f, tb, tca, base);	}	if (!handle)		return -EINVAL;	if (head == NULL) {		head = kmalloc(sizeof(struct fw_head), GFP_KERNEL);		if (head == NULL)			return -ENOBUFS;		memset(head, 0, sizeof(*head));		tcf_tree_lock(tp);		tp->root = head;		tcf_tree_unlock(tp);	}	f = kmalloc(sizeof(struct fw_filter), GFP_KERNEL);	if (f == NULL)		return -ENOBUFS;	memset(f, 0, sizeof(*f));	f->id = handle;	err = fw_change_attrs(tp, f, tb, tca, base);	if (err < 0)		goto errout;	f->next = head->ht[fw_hash(handle)];	tcf_tree_lock(tp);	head->ht[fw_hash(handle)] = f;	tcf_tree_unlock(tp);	*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_fw.c/buggy/net/sched/cls_fw.c