
1. Fix memory leak problem; 2. Modify the incorrect return value of the function. 3. Correct the incorrect memory release. Signed-off-by: Qi Tao <taoqi10@huawei.com> --- include/wd_util.h | 2 +- wd.c | 4 ++-- wd_aead.c | 5 ++--- wd_agg.c | 18 +++++++++--------- wd_cipher.c | 12 +++++------- wd_comp.c | 4 ++-- wd_dh.c | 2 +- wd_digest.c | 4 +--- wd_ecc.c | 2 +- wd_rsa.c | 2 +- wd_util.c | 6 ++++-- 11 files changed, 29 insertions(+), 32 deletions(-) diff --git a/include/wd_util.h b/include/wd_util.h index 1040f19b..9e9d4e35 100644 --- a/include/wd_util.h +++ b/include/wd_util.h @@ -124,7 +124,7 @@ struct wd_msg_handle { struct wd_init_attrs { __u32 sched_type; - const char *alg; + char alg[CRYPTO_MAX_ALG_NAME]; struct wd_alg_driver *driver; struct wd_sched *sched; struct wd_ctx_params *ctx_params; diff --git a/wd.c b/wd.c index 2f8bbbe0..75a94695 100644 --- a/wd.c +++ b/wd.c @@ -955,8 +955,8 @@ struct wd_capability *wd_get_alg_cap(void) goto alloc_err; } - strcpy(cap_node->alg_name, pnext->alg_name); - strcpy(cap_node->drv_name, pnext->drv_name); + (void)strcpy(cap_node->alg_name, pnext->alg_name); + (void)strcpy(cap_node->drv_name, pnext->drv_name); cap_node->available = pnext->available; cap_node->priority = pnext->priority; cap_node->calc_type = pnext->calc_type; diff --git a/wd_aead.c b/wd_aead.c index 2715e910..fddf5f18 100644 --- a/wd_aead.c +++ b/wd_aead.c @@ -344,9 +344,8 @@ handle_t wd_aead_alloc_sess(struct wd_aead_sess_setup *setup) } return (handle_t)sess; + err_sess: - if (sess->sched_key) - free(sess->sched_key); free(sess); return (handle_t)0; } @@ -604,7 +603,7 @@ int wd_aead_init2_(char *alg, __u32 sched_type, int task_type, goto out_driver; } - wd_aead_init_attrs.alg = alg; + (void)strcpy(wd_aead_init_attrs.alg, alg); wd_aead_init_attrs.sched_type = sched_type; wd_aead_init_attrs.driver = wd_aead_setting.driver; wd_aead_init_attrs.ctx_params = &aead_ctx_params; diff --git a/wd_agg.c b/wd_agg.c index 152f1a6e..ba2cb86a 100644 --- a/wd_agg.c +++ b/wd_agg.c @@ -374,7 +374,7 @@ static int wd_agg_init_sess_priv(struct wd_agg_sess *sess, struct wd_agg_sess_se if (sess->ops.sess_uninit) sess->ops.sess_uninit(wd_agg_setting.driver, sess->priv); WD_ERR("failed to get hash table row size: %d!\n", ret); - return ret; + return -WD_EINVAL; } sess->hash_table.table_row_size = ret; } @@ -404,7 +404,7 @@ handle_t wd_agg_alloc_sess(struct wd_agg_sess_setup *setup) ret = wd_drv_alg_support(sess->alg_name, wd_agg_setting.driver); if (!ret) { WD_ERR("failed to support agg algorithm: %s!\n", sess->alg_name); - goto err_sess; + goto free_sess; } /* Some simple scheduler don't need scheduling parameters */ @@ -412,18 +412,18 @@ handle_t wd_agg_alloc_sess(struct wd_agg_sess_setup *setup) wd_agg_setting.sched.h_sched_ctx, setup->sched_param); if (WD_IS_ERR(sess->sched_key)) { WD_ERR("failed to init agg session schedule key!\n"); - goto err_sess; + goto free_sess; } ret = wd_agg_setting.driver->get_extend_ops(&sess->ops); if (ret) { WD_ERR("failed to get agg extend ops!\n"); - goto err_sess; + goto free_key; } ret = wd_agg_init_sess_priv(sess, setup); if (ret) - goto err_sess; + goto free_key; ret = fill_agg_session(sess, setup); if (ret) { @@ -436,9 +436,9 @@ handle_t wd_agg_alloc_sess(struct wd_agg_sess_setup *setup) uninit_priv: if (sess->ops.sess_uninit) sess->ops.sess_uninit(wd_agg_setting.driver, sess->priv); -err_sess: - if (sess->sched_key) - free(sess->sched_key); +free_key: + free(sess->sched_key); +free_sess: free(sess); return (handle_t)0; } @@ -678,7 +678,7 @@ int wd_agg_init(char *alg, __u32 sched_type, int task_type, struct wd_ctx_params goto out_driver; } - wd_agg_init_attrs.alg = alg; + (void)strcpy(wd_agg_init_attrs.alg, alg); wd_agg_init_attrs.sched_type = sched_type; wd_agg_init_attrs.driver = wd_agg_setting.driver; wd_agg_init_attrs.ctx_params = &agg_ctx_params; diff --git a/wd_cipher.c b/wd_cipher.c index 59992170..86a9dcc9 100644 --- a/wd_cipher.c +++ b/wd_cipher.c @@ -270,14 +270,14 @@ handle_t wd_cipher_alloc_sess(struct wd_cipher_sess_setup *setup) if (setup->alg >= WD_CIPHER_ALG_TYPE_MAX || setup->mode >= WD_CIPHER_MODE_TYPE_MAX) { WD_ERR("failed to check algorithm!\n"); - goto err_sess; + goto free_sess; } sess->alg_name = wd_cipher_alg_name[setup->alg][setup->mode]; ret = wd_drv_alg_support(sess->alg_name, wd_cipher_setting.driver); if (!ret) { WD_ERR("failed to support this algorithm: %s!\n", sess->alg_name); - goto err_sess; + goto free_sess; } sess->alg = setup->alg; sess->mode = setup->mode; @@ -287,14 +287,12 @@ handle_t wd_cipher_alloc_sess(struct wd_cipher_sess_setup *setup) wd_cipher_setting.sched.h_sched_ctx, setup->sched_param); if (WD_IS_ERR(sess->sched_key)) { WD_ERR("failed to init session schedule key!\n"); - goto err_sess; + goto free_sess; } return (handle_t)sess; -err_sess: - if (sess->sched_key) - free(sess->sched_key); +free_sess: free(sess); return (handle_t)0; } @@ -478,7 +476,7 @@ int wd_cipher_init2_(char *alg, __u32 sched_type, int task_type, struct wd_ctx_p goto out_driver; } - wd_cipher_init_attrs.alg = alg; + (void)strcpy(wd_cipher_init_attrs.alg, alg); wd_cipher_init_attrs.sched_type = sched_type; wd_cipher_init_attrs.driver = wd_cipher_setting.driver; wd_cipher_init_attrs.ctx_params = &cipher_ctx_params; diff --git a/wd_comp.c b/wd_comp.c index ca8faa39..6a746316 100644 --- a/wd_comp.c +++ b/wd_comp.c @@ -297,7 +297,7 @@ int wd_comp_init2_(char *alg, __u32 sched_type, int task_type, struct wd_ctx_par goto out_unbind_drv; } - wd_comp_init_attrs.alg = alg; + (void)strcpy(wd_comp_init_attrs.alg, alg); wd_comp_init_attrs.sched_type = sched_type; wd_comp_init_attrs.driver = wd_comp_setting.driver; wd_comp_init_attrs.ctx_params = &comp_ctx_params; @@ -537,7 +537,7 @@ static int wd_comp_check_buffer(struct wd_comp_req *req) } if (!req->dst_len) { - WD_ERR("invalid: dst_len is NULL!\n"); + WD_ERR("invalid: dst_len is 0!\n"); return -WD_EINVAL; } diff --git a/wd_dh.c b/wd_dh.c index 3e02f2a1..8fa4f4b6 100644 --- a/wd_dh.c +++ b/wd_dh.c @@ -269,7 +269,7 @@ int wd_dh_init2_(char *alg, __u32 sched_type, int task_type, struct wd_ctx_param goto out_driver; } - wd_dh_init_attrs.alg = alg; + (void)strcpy(wd_dh_init_attrs.alg, alg); wd_dh_init_attrs.sched_type = sched_type; wd_dh_init_attrs.driver = wd_dh_setting.driver; wd_dh_init_attrs.ctx_params = &dh_ctx_params; diff --git a/wd_digest.c b/wd_digest.c index 1851203c..a709147a 100644 --- a/wd_digest.c +++ b/wd_digest.c @@ -225,8 +225,6 @@ handle_t wd_digest_alloc_sess(struct wd_digest_sess_setup *setup) return (handle_t)sess; err_sess: - if (sess->sched_key) - free(sess->sched_key); free(sess); return (handle_t)0; } @@ -414,7 +412,7 @@ int wd_digest_init2_(char *alg, __u32 sched_type, int task_type, goto out_driver; } - wd_digest_init_attrs.alg = alg; + (void)strcpy(wd_digest_init_attrs.alg, alg); wd_digest_init_attrs.sched_type = sched_type; wd_digest_init_attrs.driver = wd_digest_setting.driver; wd_digest_init_attrs.ctx_params = &digest_ctx_params; diff --git a/wd_ecc.c b/wd_ecc.c index f47df652..f3b734ce 100644 --- a/wd_ecc.c +++ b/wd_ecc.c @@ -337,7 +337,7 @@ int wd_ecc_init2_(char *alg, __u32 sched_type, int task_type, struct wd_ctx_para goto out_driver; } - wd_ecc_init_attrs.alg = alg; + (void)strcpy(wd_ecc_init_attrs.alg, alg); wd_ecc_init_attrs.sched_type = sched_type; wd_ecc_init_attrs.driver = wd_ecc_setting.driver; wd_ecc_init_attrs.ctx_params = &ecc_ctx_params; diff --git a/wd_rsa.c b/wd_rsa.c index caac7e60..8ac206a1 100644 --- a/wd_rsa.c +++ b/wd_rsa.c @@ -309,7 +309,7 @@ int wd_rsa_init2_(char *alg, __u32 sched_type, int task_type, struct wd_ctx_para goto out_driver; } - wd_rsa_init_attrs.alg = alg; + (void)strcpy(wd_rsa_init_attrs.alg, alg); wd_rsa_init_attrs.sched_type = sched_type; wd_rsa_init_attrs.driver = wd_rsa_setting.driver; wd_rsa_init_attrs.ctx_params = &rsa_ctx_params; diff --git a/wd_util.c b/wd_util.c index ac6c3e44..f1b27bf8 100644 --- a/wd_util.c +++ b/wd_util.c @@ -1166,8 +1166,10 @@ static int wd_get_wd_ctx(struct wd_env_config_per_numa *config, ctx_config->ctxs[i].ctx = h_ctx; ctx_config->ctxs[i].ctx_mode = get_ctx_mode(config, i); ret = get_op_type(config, i, ctx_config->ctxs[i].ctx_mode); - if (ret < 0) + if (ret < 0) { + wd_release_ctx(ctx_config->ctxs[i].ctx); goto free_ctx; + } ctx_config->ctxs[i].op_type = ret; } @@ -2810,7 +2812,7 @@ int wd_alg_attrs_init(struct wd_init_attrs *attrs) break; case UADK_ALG_HW: wd_get_alg_type(alg, alg_type); - attrs->alg = alg_type; + (void)strcpy(attrs->alg, alg_type); ctx_config = calloc(1, sizeof(*ctx_config)); if (!ctx_config) { -- 2.33.0