ethdev: fix crash on owner delete
authorFerruh Yigit <ferruh.yigit@intel.com>
Thu, 4 Nov 2021 11:04:21 +0000 (11:04 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 5 Nov 2021 14:35:57 +0000 (15:35 +0100)
'eth_dev->data' can be null before ethdev allocated. The API walks
through all eth devices, at least for some data can be null.

Adding 'eth_dev->data' null check before accessing it.

Fixes: 33c73aae32e4 ("ethdev: allow ownership operations on unused port")
Cc: stable@dpdk.org
Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Acked-by: Chenbo Xia <chenbo.xia@intel.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
lib/ethdev/rte_ethdev.c

index 7db84b1..8e679e4 100644 (file)
@@ -757,10 +757,13 @@ rte_eth_dev_owner_delete(const uint64_t owner_id)
        rte_spinlock_lock(&eth_dev_shared_data->ownership_lock);
 
        if (eth_is_valid_owner_id(owner_id)) {
-               for (port_id = 0; port_id < RTE_MAX_ETHPORTS; port_id++)
-                       if (rte_eth_devices[port_id].data->owner.id == owner_id)
-                               memset(&rte_eth_devices[port_id].data->owner, 0,
+               for (port_id = 0; port_id < RTE_MAX_ETHPORTS; port_id++) {
+                       struct rte_eth_dev_data *data =
+                               rte_eth_devices[port_id].data;
+                       if (data != NULL && data->owner.id == owner_id)
+                               memset(&data->owner, 0,
                                       sizeof(struct rte_eth_dev_owner));
+               }
                RTE_ETHDEV_LOG(NOTICE,
                        "All port owners owned by %016"PRIx64" identifier have removed\n",
                        owner_id);