]> git.droids-corp.org - dpdk.git/commitdiff
eal: fix devargs leak on multi-process detach request
authorDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Fri, 23 Nov 2018 14:11:07 +0000 (15:11 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Sun, 25 Nov 2018 12:32:01 +0000 (13:32 +0100)
Device detach triggered through IPC leaked some memory.
It allocated a devargs objects just to use it for
parsing the devargs string in order to retrieve the
device name. Those devargs weren't passed anywhere
and were never freed.

First of all, let's put those devargs on the stack,
so they doesn't need to be freed. Then free the
additional arguments string as soon as it's allocated,
because we won't need it.

Fixes: ac9e4a17370f ("eal: support attach/detach shared device from secondary")
Signed-off-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
lib/librte_eal/common/hotplug_mp.c

index ed0d7d3c3bc4527d8393a597788485f9c1d15129..070e2e0c2796f3bebc9fb91b5395f44ec3966914 100644 (file)
@@ -87,7 +87,7 @@ __handle_secondary_request(void *param)
        const struct eal_dev_mp_req *req =
                (const struct eal_dev_mp_req *)msg->param;
        struct eal_dev_mp_req tmp_req;
-       struct rte_devargs *da;
+       struct rte_devargs da;
        struct rte_device *dev;
        struct rte_bus *bus;
        int ret = 0;
@@ -114,15 +114,11 @@ __handle_secondary_request(void *param)
                                goto rollback;
                }
        } else if (req->t == EAL_DEV_REQ_TYPE_DETACH) {
-               da = calloc(1, sizeof(*da));
-               if (da == NULL) {
-                       ret = -ENOMEM;
-                       goto finish;
-               }
-
-               ret = rte_devargs_parse(da, req->devargs);
+               ret = rte_devargs_parse(&da, req->devargs);
                if (ret != 0)
                        goto finish;
+               free(da.args); /* we don't need those */
+               da.args = NULL;
 
                ret = eal_dev_hotplug_request_to_secondary(&tmp_req);
                if (ret != 0) {
@@ -131,16 +127,16 @@ __handle_secondary_request(void *param)
                        goto rollback;
                }
 
-               bus = rte_bus_find_by_name(da->bus->name);
+               bus = rte_bus_find_by_name(da.bus->name);
                if (bus == NULL) {
-                       RTE_LOG(ERR, EAL, "Cannot find bus (%s)\n", da->bus->name);
+                       RTE_LOG(ERR, EAL, "Cannot find bus (%s)\n", da.bus->name);
                        ret = -ENOENT;
                        goto finish;
                }
 
-               dev = bus->find_device(NULL, cmp_dev_name, da->name);
+               dev = bus->find_device(NULL, cmp_dev_name, da.name);
                if (dev == NULL) {
-                       RTE_LOG(ERR, EAL, "Cannot find plugged device (%s)\n", da->name);
+                       RTE_LOG(ERR, EAL, "Cannot find plugged device (%s)\n", da.name);
                        ret = -ENOENT;
                        goto finish;
                }