diff options
Diffstat (limited to 'net/sched/sch_api.c')
| -rw-r--r-- | net/sched/sch_api.c | 11 | 
1 files changed, 6 insertions, 5 deletions
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 2b935e7cfe7..281c1bded1f 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -291,17 +291,18 @@ struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, struct nlattr *ta  {  	struct qdisc_rate_table *rtab; +	if (tab == NULL || r->rate == 0 || r->cell_log == 0 || +	    nla_len(tab) != TC_RTAB_SIZE) +		return NULL; +  	for (rtab = qdisc_rtab_list; rtab; rtab = rtab->next) { -		if (memcmp(&rtab->rate, r, sizeof(struct tc_ratespec)) == 0) { +		if (!memcmp(&rtab->rate, r, sizeof(struct tc_ratespec)) && +		    !memcmp(&rtab->data, nla_data(tab), 1024)) {  			rtab->refcnt++;  			return rtab;  		}  	} -	if (tab == NULL || r->rate == 0 || r->cell_log == 0 || -	    nla_len(tab) != TC_RTAB_SIZE) -		return NULL; -  	rtab = kmalloc(sizeof(*rtab), GFP_KERNEL);  	if (rtab) {  		rtab->rate = *r;  |