[PATCH] util: fix very old bug/typo in virNetDevParseVfInfo()
Michal Privoznik
mprivozn at redhat.com
Wed Oct 21 11:27:37 UTC 2020
On 10/21/20 4:38 AM, Laine Stump wrote:
> When this function was recently changed to add in parsing of
> IFLA_VF_STATS, I noticed that the checks for existence of IFLA_VF_MAC
> and IFLA_VF_VLAN were looking in the *wrong array*. The array that
> contains the results of parsing each IFLA_VFINFO in
> tb[IFLA_VFINFO_LIST] is tb_vf, but we were checking for these in tb
> (which is the array containing the results of the toplevel parsing of
> the netlink message, *not* the results of parsing one of the nested
> IFLA_VFINFO's.
>
> This incorrect code has been here since the function was originally
> written in 2012. It has only worked all these years due to coincidence
> - the items at those indexes in tb are IFLA_ADDRESS and IFLA_BROADCAST
> (of the *PF*, not of any of its VFs), and those happen to always be
> present in the toplevel netlink message; since we are only looking in
> the incorrect place to check for mere existence of the attribute (but
> are doing the actual retrieval of the attribute from the correct
> place), this bug has no real consequences other than confusing anyone
> trying to understand the code.
>
> Signed-off-by: Laine Stump <laine at redhat.com>
> ---
> src/util/virnetdev.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
> index e284d62233..591a73cb45 100644
> --- a/src/util/virnetdev.c
> +++ b/src/util/virnetdev.c
> @@ -1691,7 +1691,7 @@ virNetDevParseVfInfo(struct nlattr **tb, int32_t vf, virMacAddrPtr mac,
> return rc;
> }
>
> - if (mac && tb[IFLA_VF_MAC]) {
> + if (mac && tb_vf[IFLA_VF_MAC]) {
> vf_mac = RTA_DATA(tb_vf[IFLA_VF_MAC]);
> if (vf_mac && vf_mac->vf == vf) {
> virMacAddrSetRaw(mac, vf_mac->mac);
> @@ -1699,7 +1699,7 @@ virNetDevParseVfInfo(struct nlattr **tb, int32_t vf, virMacAddrPtr mac,
> }
> }
>
> - if (vlanid && tb[IFLA_VF_VLAN]) {
> + if (vlanid && tb_vf[IFLA_VF_VLAN]) {
> vf_vlan = RTA_DATA(tb_vf[IFLA_VF_VLAN]);
> if (vf_vlan && vf_vlan->vf == vf) {
> *vlanid = vf_vlan->vlan;
>
Reviewed-by: Michal Privoznik <mprivozn at redhat.com>
Also, feel free to bring the @tb_vf declaration into the loop (in a
separate trivial patch).
Michal
More information about the libvir-list
mailing list