net/sched: mqprio: Add length check for TCA_MQPRIO_{MAX/MIN}_RATE64
[ Upstream commit6c58c8816a
] The nla_for_each_nested parsing in function mqprio_parse_nlattr() does not check the length of the nested attribute. This can lead to an out-of-attribute read and allow a malformed nlattr (e.g., length 0) to be viewed as 8 byte integer and passed to priv->max_rate/min_rate. This patch adds the check based on nla_len() when check the nla_type(), which ensures that the length of these two attribute must equals sizeof(u64). Fixes:4e8b86c062
("mqprio: Introduce new hardware offload mode and shaper in mqprio") Reviewed-by: Victor Nogueira <victor@mojatatu.com> Signed-off-by: Lin Ma <linma@zju.edu.cn> Link: https://lore.kernel.org/r/20230725024227.426561-1-linma@zju.edu.cn Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
eefc0b3215
commit
0f7432b7c3
|
@ -174,6 +174,13 @@ static int mqprio_parse_nlattr(struct Qdisc *sch, struct tc_mqprio_qopt *qopt,
|
||||||
"Attribute type expected to be TCA_MQPRIO_MIN_RATE64");
|
"Attribute type expected to be TCA_MQPRIO_MIN_RATE64");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nla_len(attr) != sizeof(u64)) {
|
||||||
|
NL_SET_ERR_MSG_ATTR(extack, attr,
|
||||||
|
"Attribute TCA_MQPRIO_MIN_RATE64 expected to have 8 bytes length");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (i >= qopt->num_tc)
|
if (i >= qopt->num_tc)
|
||||||
break;
|
break;
|
||||||
priv->min_rate[i] = *(u64 *)nla_data(attr);
|
priv->min_rate[i] = *(u64 *)nla_data(attr);
|
||||||
|
@ -196,6 +203,13 @@ static int mqprio_parse_nlattr(struct Qdisc *sch, struct tc_mqprio_qopt *qopt,
|
||||||
"Attribute type expected to be TCA_MQPRIO_MAX_RATE64");
|
"Attribute type expected to be TCA_MQPRIO_MAX_RATE64");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nla_len(attr) != sizeof(u64)) {
|
||||||
|
NL_SET_ERR_MSG_ATTR(extack, attr,
|
||||||
|
"Attribute TCA_MQPRIO_MAX_RATE64 expected to have 8 bytes length");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (i >= qopt->num_tc)
|
if (i >= qopt->num_tc)
|
||||||
break;
|
break;
|
||||||
priv->max_rate[i] = *(u64 *)nla_data(attr);
|
priv->max_rate[i] = *(u64 *)nla_data(attr);
|
||||||
|
|
Loading…
Reference in New Issue