[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