From: Weili Qian <qianweili@huawei.com> pthread_spin_init returns a positive errno on failure, but wd_blockpool_create/wd_mempool_create checked "if (ret < 0)" which was always false, and wd_soft_alloc_ctx did not check the return value at all, leaving spinlocks uninitialized. Use "if (ret)" to detect failure, check both spin_init calls in wd_soft_alloc_ctx, clean up on failure, and return -ret so callers using "if (ret < 0)" can detect the error. Signed-off-by: Weili Qian <qianweili@huawei.com> --- drv/wd_drv.c | 16 ++++++++++++++-- wd_mempool.c | 4 ++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/drv/wd_drv.c b/drv/wd_drv.c index 08014dd..4bac551 100644 --- a/drv/wd_drv.c +++ b/drv/wd_drv.c @@ -11,6 +11,7 @@ int wd_soft_alloc_ctx(char *alg_name, void *params, handle_t *ctx) { struct wd_soft_ctx *sfctx; + int ret; if (!params || !ctx) { WD_ERR("invalid: params, or ctx is NULL!\n"); @@ -27,8 +28,19 @@ int wd_soft_alloc_ctx(char *alg_name, void *params, handle_t *ctx) /* Initialize as software context */ sfctx->fd = -1; sfctx->ctx_type = UADK_ALG_SOFT; - pthread_spin_init(&sfctx->slock, PTHREAD_PROCESS_PRIVATE); - pthread_spin_init(&sfctx->rlock, PTHREAD_PROCESS_PRIVATE); + ret = pthread_spin_init(&sfctx->slock, PTHREAD_PROCESS_PRIVATE); + if (ret) { + WD_ERR("failed to init slock!\n"); + free(sfctx); + return -ret; + } + ret = pthread_spin_init(&sfctx->rlock, PTHREAD_PROCESS_PRIVATE); + if (ret) { + WD_ERR("failed to init rlock!\n"); + pthread_spin_destroy(&sfctx->slock); + free(sfctx); + return -ret; + } /* Return context handle */ *ctx = (handle_t)sfctx; diff --git a/wd_mempool.c b/wd_mempool.c index 15c8d45..4081130 100644 --- a/wd_mempool.c +++ b/wd_mempool.c @@ -561,7 +561,7 @@ handle_t wd_blockpool_create(handle_t mempool, size_t block_size, bp->free_block_num = block_num; bp->mp = mp; ret = pthread_spin_init(&bp->lock, PTHREAD_PROCESS_PRIVATE); - if (ret < 0) + if (ret) goto err_free_bp; ret = alloc_mem_from_mempool(mp, bp); @@ -910,7 +910,7 @@ handle_t wd_mempool_create(size_t size, int node) mp->size = tmp; mp->blk_size = WD_MEMPOOL_BLOCK_SIZE; ret = pthread_spin_init(&mp->lock, PTHREAD_PROCESS_PRIVATE); - if (ret < 0) + if (ret) goto free_pool; ret = alloc_mem_from_hugepage(mp); -- 2.50.1.windows.1