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 wasallocated.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.