mempool: fix crash when handler not found
authorShreyansh Jain <shreyansh.jain@nxp.com>
Fri, 31 Mar 2017 05:35:35 +0000 (11:05 +0530)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 3 Apr 2017 16:53:10 +0000 (18:53 +0200)
In case the stack or ring mempool handler are compiled as shared
library and not linked in with test binary, segfault is reported.
This is because return value of rte_mempool_set_ops_byname is not
being checked in rte_mempool_ops_alloc.

This patch handles error returned from rte_mempool_set_ops_byname
when a mempool is not found.

Fixes: 449c49b93a6b ("mempool: support handler operations")

Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
lib/librte_mempool/rte_mempool.c

index 40d3afd..ef7d3d1 100644 (file)
@@ -868,6 +868,7 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size,
        rte_mempool_obj_cb_t *obj_init, void *obj_init_arg,
        int socket_id, unsigned flags)
 {
+       int ret;
        struct rte_mempool *mp;
 
        mp = rte_mempool_create_empty(name, n, elt_size, cache_size,
@@ -880,13 +881,16 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size,
         * set the correct index into the table of ops structs.
         */
        if ((flags & MEMPOOL_F_SP_PUT) && (flags & MEMPOOL_F_SC_GET))
-               rte_mempool_set_ops_byname(mp, "ring_sp_sc", NULL);
+               ret = rte_mempool_set_ops_byname(mp, "ring_sp_sc", NULL);
        else if (flags & MEMPOOL_F_SP_PUT)
-               rte_mempool_set_ops_byname(mp, "ring_sp_mc", NULL);
+               ret = rte_mempool_set_ops_byname(mp, "ring_sp_mc", NULL);
        else if (flags & MEMPOOL_F_SC_GET)
-               rte_mempool_set_ops_byname(mp, "ring_mp_sc", NULL);
+               ret = rte_mempool_set_ops_byname(mp, "ring_mp_sc", NULL);
        else
-               rte_mempool_set_ops_byname(mp, "ring_mp_mc", NULL);
+               ret = rte_mempool_set_ops_byname(mp, "ring_mp_mc", NULL);
+
+       if (ret)
+               goto fail;
 
        /* call the mempool priv initializer */
        if (mp_init)