
Async packet reception timeout without timely failure return can lead to issues such as software calculation failure. First initialize the value of req.state to -1. If the value of req.state is not 0 after async_pause_job(), it indicates an exception in packet reception, and the function can directly return an error. Signed-off-by: Qi Tao <taoqi10@huawei.com> Signed-off-by: JiangShui Yang <yangjiangshui@h-partners.com> --- src/uadk_prov.h | 1 + src/uadk_prov_aead.c | 26 ++++++++------------------ src/uadk_prov_cipher.c | 8 ++++++-- src/uadk_prov_dh.c | 2 +- src/uadk_prov_digest.c | 6 +++++- src/uadk_prov_pkey.c | 2 +- src/uadk_prov_rsa.c | 2 +- 7 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/uadk_prov.h b/src/uadk_prov.h index 47bfb43..b6c236a 100644 --- a/src/uadk_prov.h +++ b/src/uadk_prov.h @@ -28,6 +28,7 @@ #define UADK_DEVICE_ERROR 3 #define HW_SEC_V2 2 #define HW_SEC_V3 3 +#define POLL_ERROR (-1) /* Copy openssl/providers/implementations/include/prov/names.h */ #define PROV_NAMES_SHA2_224 "SHA2-224:SHA-224:SHA224:2.16.840.1.101.3.4.2.4" diff --git a/src/uadk_prov_aead.c b/src/uadk_prov_aead.c index 1163328..6f33f43 100644 --- a/src/uadk_prov_aead.c +++ b/src/uadk_prov_aead.c @@ -360,7 +360,7 @@ static int uadk_do_aead_sync(struct aead_priv_ctx *priv, unsigned char *out, static int uadk_do_aead_async(struct aead_priv_ctx *priv, struct async_op *op, unsigned char *out, const unsigned char *in, size_t inlen) { - struct uadk_e_cb_info *cb_param; + struct uadk_e_cb_info cb_param; int cnt = 0; int ret; @@ -376,22 +376,16 @@ static int uadk_do_aead_async(struct aead_priv_ctx *priv, struct async_op *op, uadk_do_aead_async_prepare(priv, out, in, inlen); - cb_param = malloc(sizeof(struct uadk_e_cb_info)); - if (unlikely(!cb_param)) { - fprintf(stderr, "failed to alloc cb_param.\n"); - return UADK_AEAD_FAIL; - } - - cb_param->op = op; - cb_param->priv = &priv->req; + cb_param.op = op; + cb_param.priv = &priv->req; priv->req.cb = uadk_prov_aead_cb; - priv->req.cb_param = cb_param; + priv->req.cb_param = &cb_param; priv->req.msg_state = AEAD_MSG_BLOCK; - priv->req.state = UADK_AEAD_FAIL; + priv->req.state = POLL_ERROR; ret = async_get_free_task(&op->idx); if (unlikely(!ret)) - goto free_cb_param; + return UADK_AEAD_FAIL; do { ret = wd_do_aead_async(priv->sess, &priv->req); @@ -404,8 +398,7 @@ static int uadk_do_aead_async(struct aead_priv_ctx *priv, struct async_op *op, continue; async_free_poll_task(op->idx, 0); - ret = UADK_AEAD_FAIL; - goto free_cb_param; + return UADK_AEAD_FAIL; } } while (ret == -EBUSY); @@ -413,15 +406,12 @@ static int uadk_do_aead_async(struct aead_priv_ctx *priv, struct async_op *op, if (unlikely(!ret || priv->req.state)) { fprintf(stderr, "do aead async job failed, ret: %d, state: %u!\n", ret, priv->req.state); - ret = UADK_AEAD_FAIL; - goto free_cb_param; + return UADK_AEAD_FAIL; } if (priv->req.assoc_bytes) memcpy(out, priv->req.dst + priv->req.assoc_bytes, inlen); -free_cb_param: - free(cb_param); return ret; } diff --git a/src/uadk_prov_cipher.c b/src/uadk_prov_cipher.c index f63288f..eb31f2d 100644 --- a/src/uadk_prov_cipher.c +++ b/src/uadk_prov_cipher.c @@ -418,12 +418,15 @@ static int uadk_prov_cipher_init(struct cipher_priv_ctx *priv, static void async_cb(struct wd_cipher_req *req, void *data) { struct uadk_e_cb_info *cipher_cb_param; + struct wd_cipher_req *req_origin; struct async_op *op; if (!req || !req->cb_param) return; cipher_cb_param = req->cb_param; + req_origin = cipher_cb_param->priv; + req_origin->state = req->state; op = cipher_cb_param->op; if (op && op->job && !op->done) { op->done = 1; @@ -454,9 +457,10 @@ static int uadk_do_cipher_async(struct cipher_priv_ctx *priv, struct async_op *o } cb_param.op = op; - cb_param.priv = priv; + cb_param.priv = &priv->req; priv->req.cb = (void *)async_cb; priv->req.cb_param = &cb_param; + priv->req.state = POLL_ERROR; ret = async_get_free_task(&idx); if (!ret) return UADK_P_FAIL; @@ -472,7 +476,7 @@ static int uadk_do_cipher_async(struct cipher_priv_ctx *priv, struct async_op *o } while (ret == -EBUSY); ret = async_pause_job(priv, op, ASYNC_TASK_CIPHER); - if (!ret) + if (!ret || priv->req.state) return UADK_P_FAIL; return UADK_P_SUCCESS; diff --git a/src/uadk_prov_dh.c b/src/uadk_prov_dh.c index f3724ac..f6262d4 100644 --- a/src/uadk_prov_dh.c +++ b/src/uadk_prov_dh.c @@ -845,7 +845,7 @@ static int uadk_prov_dh_do_crypto(struct uadk_dh_sess *dh_sess) cb_param.priv = &dh_sess->req; dh_sess->req.cb = uadk_prov_dh_cb; dh_sess->req.cb_param = &cb_param; - dh_sess->req.status = -1; + dh_sess->req.status = POLL_ERROR; ret = async_get_free_task(&idx); if (!ret) goto err; diff --git a/src/uadk_prov_digest.c b/src/uadk_prov_digest.c index 921c3db..d6af557 100644 --- a/src/uadk_prov_digest.c +++ b/src/uadk_prov_digest.c @@ -497,12 +497,15 @@ soft_update: static void uadk_async_cb(struct wd_digest_req *req, void *data) { struct uadk_e_cb_info *digest_cb_param; + struct wd_digest_req *req_origin; struct async_op *op; if (!req || !req->cb_param) return; digest_cb_param = req->cb_param; + req_origin = digest_cb_param->priv; + req_origin->state = req->state; op = digest_cb_param->op; if (op && op->job && !op->done) { op->done = 1; @@ -540,9 +543,10 @@ static int uadk_do_digest_async(struct digest_priv_ctx *priv, struct async_op *o } cb_param.op = op; - cb_param.priv = priv; + cb_param.priv = &priv->req; priv->req.cb = (void *)uadk_async_cb; priv->req.cb_param = &cb_param; + priv->req.state = POLL_ERROR; ret = async_get_free_task(&idx); if (!ret) diff --git a/src/uadk_prov_pkey.c b/src/uadk_prov_pkey.c index 1323cfd..ca853ae 100644 --- a/src/uadk_prov_pkey.c +++ b/src/uadk_prov_pkey.c @@ -390,7 +390,7 @@ int uadk_prov_ecc_crypto(handle_t sess, struct wd_ecc_req *req, void *usr) cb_param.priv = req; req->cb = uadk_prov_ecc_cb; req->cb_param = &cb_param; - req->status = -1; + req->status = POLL_ERROR; ret = async_get_free_task(&idx); if (ret == 0) diff --git a/src/uadk_prov_rsa.c b/src/uadk_prov_rsa.c index eac4e46..8f7d734 100644 --- a/src/uadk_prov_rsa.c +++ b/src/uadk_prov_rsa.c @@ -1297,7 +1297,7 @@ static int rsa_do_crypto(struct uadk_rsa_sess *rsa_sess) cb_param.priv = &(rsa_sess->req); rsa_sess->req.cb = uadk_e_rsa_cb; rsa_sess->req.cb_param = &cb_param; - rsa_sess->req.status = -1; + rsa_sess->req.status = POLL_ERROR; ret = async_get_free_task(&idx); if (ret == 0) -- 2.33.0