Message ID | 20200623134532.1271737-1-ferruh.yigit@intel.com (mailing list archive) |
---|---|
State | Accepted, archived |
Delegated to: | Qi Zhang |
Headers | show |
Series | net/iavf: fix uninitialized variable | expand |
Context | Check | Description |
---|---|---|
ci/checkpatch | success | coding style OK |
ci/iol-broadcom-Performance | success | Performance Testing PASS |
ci/iol-intel-Performance | success | Performance Testing PASS |
ci/iol-nxp-Performance | success | Performance Testing PASS |
ci/travis-robot | success | Travis build: passed |
ci/Intel-compilation | success | Compilation OK |
ci/iol-mellanox-Performance | success | Performance Testing PASS |
ci/iol-testing | success | Testing PASS |
> -----Original Message----- > From: dev <dev-bounces@dpdk.org> On Behalf Of Ferruh Yigit > Sent: Tuesday, June 23, 2020 9:46 PM > To: Wu, Jingjing <jingjing.wu@intel.com>; Xing, Beilei <beilei.xing@intel.com> > Cc: dev@dpdk.org; Yigit, Ferruh <ferruh.yigit@intel.com>; stable@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@dpdk.org > > Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com> Acked-by: Qi Zhang <qi.z.zhang@intel.com> Applied to dpdk-next-net-intel with below fix line be added Fixes: 48de41ca11f0 ("net/avf: enable link status update") Thanks Qi
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 2b1066b0a..45c853f19 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -596,6 +596,8 @@ iavf_dev_link_update(struct rte_eth_dev *dev, struct rte_eth_link new_link; struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); + memset(&new_link, 0, sizeof(new_link)); + /* Only read status info stored in VF, and the info is updated * when receive LINK_CHANGE evnet from PF by Virtchnnl. */
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@dpdk.org Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com> --- Reference: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95818 --- drivers/net/iavf/iavf_ethdev.c | 2 ++ 1 file changed, 2 insertions(+)