[dpdk-stable] [dpdk-dev] [PATCH] net/iavf: fix uninitialized variable
Zhang, Qi Z
qi.z.zhang at intel.com
Tue Jun 30 16:33:02 CEST 2020
> -----Original Message-----
> From: dev <dev-bounces at dpdk.org> On Behalf Of Ferruh Yigit
> Sent: Tuesday, June 23, 2020 9:46 PM
> To: Wu, Jingjing <jingjing.wu at intel.com>; Xing, Beilei <beilei.xing at intel.com>
> Cc: dev at dpdk.org; Yigit, Ferruh <ferruh.yigit at intel.com>; stable at dpdk.org
> Subject: [dpdk-dev] [PATCH] net/iavf: fix uninitialized variable
>
> This is observed with experimental gcc 11, although the older gcc versions
> don't complain about it, issue seems a valid one.
> gcc version 11.0.0 20200621 (experimental) (GCC)
>
> Build error
> .../drivers/net/iavf/iavf_ethdev.c: In function ‘iavf_dev_link_update’:
> .../drivers/net/iavf/iavf_ethdev.c:641:6:
> error: ‘new_link’ is used uninitialized [-Werror=uninitialized]
> 641 | if (rte_atomic64_cmpset((uint64_t *)&dev->data->dev_link,
> |
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 642 | *(uint64_t *)&dev->data->dev_link,
> | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 643 | *(uint64_t *)&new_link) == 0)
> | ~~~~~~~~~~~~~~~~~~~~~~~
> .../drivers/net/iavf/iavf_ethdev.c:596:22:
> note: ‘new_link’ declared here
> 596 | struct rte_eth_link new_link;
> | ^~~~~~~~
> cc1: all warnings being treated as error
>
> All fields of the 'new_link' struct is already set in function, so the
> 'uninitialized' warning is hard to get. This is because the combination of
> aligning and bitfield usage of the struct
>
> The definition of the struct is:
> struct rte_eth_link {
> uint32_t link_speed; /**< ETH_SPEED_NUM_ */
> uint16_t link_duplex : 1; /**< ETH_LINK_[HALF/FULL]_DUPLEX
> */
> uint16_t link_autoneg : 1; /**< ETH_LINK_[AUTONEG/FIXED] */
> uint16_t link_status : 1; /**< ETH_LINK_[DOWN/UP] */
> } __rte_aligned(8); /**< aligned for atomic64 read/write */
>
> Overall the size of the 'struct rte_eth_link' is 64 bits, but function only sets
> the 35 bits of it, because only 3 bits of 16 bits variable are used.
> When the struct cast to 'uint64_t' because of the 'rte_atomic64_cmpset'
> the upper 29 bits are used without initialization.
>
> To fix the uninitialized usage, memset the variable 'new_link' before using it.
>
> Cc: stable at dpdk.org
>
> Signed-off-by: Ferruh Yigit <ferruh.yigit at intel.com>
Acked-by: Qi Zhang <qi.z.zhang at intel.com>
Applied to dpdk-next-net-intel with below fix line be added
Fixes: 48de41ca11f0 ("net/avf: enable link status update")
Thanks
Qi
More information about the stable
mailing list