diff options
| -rw-r--r-- | net/sched/act_ipt.c | 7 | ||||
| -rw-r--r-- | net/sched/act_pedit.c | 5 | ||||
| -rw-r--r-- | net/sched/act_simple.c | 5 | 
3 files changed, 14 insertions, 3 deletions
diff --git a/net/sched/act_ipt.c b/net/sched/act_ipt.c index 60e281ad0f0..58fb3c7aab9 100644 --- a/net/sched/act_ipt.c +++ b/net/sched/act_ipt.c @@ -185,7 +185,12 @@ err3:  err2:  	kfree(tname);  err1: -	kfree(pc); +	if (ret == ACT_P_CREATED) { +		if (est) +			gen_kill_estimator(&pc->tcfc_bstats, +					   &pc->tcfc_rate_est); +		kfree_rcu(pc, tcfc_rcu); +	}  	return err;  } diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c index 26aa2f6ce25..45c53ab067a 100644 --- a/net/sched/act_pedit.c +++ b/net/sched/act_pedit.c @@ -74,7 +74,10 @@ static int tcf_pedit_init(struct nlattr *nla, struct nlattr *est,  		p = to_pedit(pc);  		keys = kmalloc(ksize, GFP_KERNEL);  		if (keys == NULL) { -			kfree(pc); +			if (est) +				gen_kill_estimator(&pc->tcfc_bstats, +						   &pc->tcfc_rate_est); +			kfree_rcu(pc, tcfc_rcu);  			return -ENOMEM;  		}  		ret = ACT_P_CREATED; diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c index 3922f2a2821..3714f60f0b3 100644 --- a/net/sched/act_simple.c +++ b/net/sched/act_simple.c @@ -131,7 +131,10 @@ static int tcf_simp_init(struct nlattr *nla, struct nlattr *est,  		d = to_defact(pc);  		ret = alloc_defdata(d, defdata);  		if (ret < 0) { -			kfree(pc); +			if (est) +				gen_kill_estimator(&pc->tcfc_bstats, +						   &pc->tcfc_rate_est); +			kfree_rcu(pc, tcfc_rcu);  			return ret;  		}  		d->tcf_action = parm->action;  |