From 44cebef721a644dd4139596942d24d0967c1cfb3 Mon Sep 17 00:00:00 2001 From: Shreyansh Jain Date: Fri, 31 Mar 2017 11:05:35 +0530 Subject: [PATCH] mempool: fix crash when handler not found 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 Acked-by: Olivier Matz --- lib/librte_mempool/rte_mempool.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c index 40d3afd662..ef7d3d15bd 100644 --- a/lib/librte_mempool/rte_mempool.c +++ b/lib/librte_mempool/rte_mempool.c @@ -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) -- 2.20.1