Re: [PATCH] rtnetlink: fix data overflow in rtnl_calcit()

From: zhudi (J) <hidden>
Date: 2020-10-19 01:09:25

 > On Fri, Oct 16, 2020 at 10:02:38AM +0800, zhudi wrote:
quoted
"ip addr show" command execute error when we have a physical network
card with number of VFs larger than 247.

The return value of if_nlmsg_size() in rtnl_calcit() will exceed range
of u16 data type when any network cards has a larger number of VFs.
rtnl_vfinfo_size() will significant increase needed dump size when the
value of num_vfs is larger.

Eventually we get a wrong value of min_ifinfo_dump_size because of
overflow which decides the memory size needed by netlink dump and
netlink_dump() will return -EMSGSIZE because of not enough memory was
allocated.
quoted
So fix it by promoting  min_dump_alloc data type to u32 to avoid data
overflow and it's also align with the data type of struct
netlink_callback{}.min_dump_alloc which is assigned by return value of
rtnl_calcit()
Unfortunately this is only part of the problem. For a NIC with so many VFs
(not sure if exactly 247 but it's close to that), IFLA_VFINFO_LIST nested
attribute itself would be over 64KB long which is not possible as attribute size
is u16.

So we should rather fail in such case (except when IFLA_VFINFO_LIST itself
fits into 64KB but the whole netlink message would not) and provide an
alternative way to get information about all VFs.
Thanks for your replying,  it's right. The patch only fix the situation that IFLA_VFINFO_LIST itself
fits into 64KB but the whole netlink message would not.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help