After we insert a devargs into devargs_list, following bus->scan may
destroy it due to another rte_devargs_insert. Its better not to use
a devargs pointer after it has been inserted.

Fixes: 911462eb4a5f ("eal: simplify parameters of hotplug functions")

Signed-off-by: Qi Zhang <[email protected]>
---
 lib/librte_eal/common/eal_common_dev.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_dev.c 
b/lib/librte_eal/common/eal_common_dev.c
index 8b0844af1..d4b1ea70d 100644
--- a/lib/librte_eal/common/eal_common_dev.c
+++ b/lib/librte_eal/common/eal_common_dev.c
@@ -185,6 +185,7 @@ local_dev_probe(const char *devargs, struct rte_device 
**new_dev)
 {
        struct rte_device *dev;
        struct rte_devargs *da;
+       struct rte_devargs da_cp;
        int ret;
 
        *new_dev = NULL;
@@ -203,18 +204,23 @@ local_dev_probe(const char *devargs, struct rte_device 
**new_dev)
                goto err_devarg;
        }
 
+       /**
+        * its better not to use da after rte_devargs_insert,
+        * so make a copy here.
+        */
+       da_cp = *da;
        ret = rte_devargs_insert(da);
        if (ret)
                goto err_devarg;
 
-       ret = da->bus->scan();
+       ret = da_cp.bus->scan();
        if (ret)
                goto err_devarg;
 
-       dev = da->bus->find_device(NULL, cmp_dev_name, da->name);
+       dev = da_cp.bus->find_device(NULL, cmp_dev_name, da_cp.name);
        if (dev == NULL) {
                RTE_LOG(ERR, EAL, "Cannot find device (%s)\n",
-                       da->name);
+                       da_cp.name);
                ret = -ENODEV;
                goto err_devarg;
        }
-- 
2.13.6

Reply via email to