forked from Minki/linux
net_sched: qdisc_get_rtab() must check data[] array
qdisc_get_rtab() should check not only the keys in struct tc_ratespec, but also the full data[] array. "tc ... linklayer atm " only perturbs values in the 256 slots array. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1612e111e4
commit
40edeff6e1
@ -291,17 +291,18 @@ struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, struct nlattr *ta
|
|||||||
{
|
{
|
||||||
struct qdisc_rate_table *rtab;
|
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) {
|
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++;
|
rtab->refcnt++;
|
||||||
return rtab;
|
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);
|
rtab = kmalloc(sizeof(*rtab), GFP_KERNEL);
|
||||||
if (rtab) {
|
if (rtab) {
|
||||||
rtab->rate = *r;
|
rtab->rate = *r;
|
||||||
|
Loading…
Reference in New Issue
Block a user