diff mbox

[v4] linux-generic: crypto: properly handle errors in packet copy

Message ID 20170424144608.27695-1-dmitry.ereminsolenikov@linaro.org
State Accepted
Commit de52bbc9058604745e443195fbd9f4504d700d8d
Headers show

Commit Message

Dmitry Eremin-Solenikov April 24, 2017, 2:46 p.m. UTC
Add proper handling for errors returned by odp_packet_copy_from_pkt().

Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>

---
 platform/linux-generic/odp_crypto.c | 24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

-- 
2.11.0

Comments

Bill Fischofer April 24, 2017, 11:26 p.m. UTC | #1
On Mon, Apr 24, 2017 at 9:46 AM, Dmitry Eremin-Solenikov <
dmitry.ereminsolenikov@linaro.org> wrote:

> Add proper handling for errors returned by odp_packet_copy_from_pkt().

>

> Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>

>


Reviewed-by: Bill Fischofer <bill.fischofer@linaro.org>



> ---

>  platform/linux-generic/odp_crypto.c | 24 ++++++++++++++++++++----

>  1 file changed, 20 insertions(+), 4 deletions(-)

>

> diff --git a/platform/linux-generic/odp_crypto.c

> b/platform/linux-generic/odp_crypto.c

> index 54b222fd..83122800 100644

> --- a/platform/linux-generic/odp_crypto.c

> +++ b/platform/linux-generic/odp_crypto.c

> @@ -871,14 +871,17 @@ odp_crypto_operation(odp_crypto_op_param_t *param,

>         odp_crypto_alg_err_t rc_auth = ODP_CRYPTO_ALG_ERR_NONE;

>         odp_crypto_generic_session_t *session;

>         odp_crypto_op_result_t local_result;

> +       odp_bool_t allocated = false;

>

>         session = (odp_crypto_generic_session_t *)(intptr_t)param->session;

>

>         /* Resolve output buffer */

>         if (ODP_PACKET_INVALID == param->out_pkt &&

> -           ODP_POOL_INVALID != session->p.output_pool)

> +           ODP_POOL_INVALID != session->p.output_pool) {

>                 param->out_pkt = odp_packet_alloc(session->p.output_pool,

>                                 odp_packet_len(param->pkt));

> +               allocated = true;

> +       }

>

>         if (odp_unlikely(ODP_PACKET_INVALID == param->out_pkt)) {

>                 ODP_DBG("Alloc failed.\n");

> @@ -886,11 +889,16 @@ odp_crypto_operation(odp_crypto_op_param_t *param,

>         }

>

>         if (param->pkt != param->out_pkt) {

> -               (void)odp_packet_copy_from_pkt(param->out_pkt,

> +               int ret;

> +

> +               ret = odp_packet_copy_from_pkt(param->out_pkt,

>                                                0,

>                                                param->pkt,

>                                                0,

>                                                odp_packet_len(param->pkt));

> +               if (odp_unlikely(ret < 0))

> +                       goto err;

> +

>                 _odp_packet_copy_md_to_packet(param->pkt, param->out_pkt);

>                 odp_packet_free(param->pkt);

>                 param->pkt = ODP_PACKET_INVALID;

> @@ -932,7 +940,7 @@ odp_crypto_operation(odp_crypto_op_param_t *param,

>                 op_result->result = local_result;

>                 if (odp_queue_enq(session->p.compl_queue,

> completion_event)) {

>                         odp_event_free(completion_event);

> -                       return -1;

> +                       goto err;

>                 }

>

>                 /* Indicate to caller operation was async */

> @@ -940,13 +948,21 @@ odp_crypto_operation(odp_crypto_op_param_t *param,

>         } else {

>                 /* Synchronous, simply return results */

>                 if (!result)

> -                       return -1;

> +                       goto err;

>                 *result = local_result;

>

>                 /* Indicate to caller operation was sync */

>                 *posted = 0;

>         }

>         return 0;

> +

> +err:

> +       if (allocated) {

> +               odp_packet_free(param->out_pkt);

> +               param->out_pkt = ODP_PACKET_INVALID;

> +       }

> +

> +       return -1;

>  }

>

>  static void ODP_UNUSED openssl_thread_id(CRYPTO_THREADID ODP_UNUSED *id)

> --

> 2.11.0

>

>
Balasubramanian Manoharan April 25, 2017, 12:35 a.m. UTC | #2
Reviewed-by: Balasubramanian Manoharan <bala.manoharan@linaro.org>



> On 25-Apr-2017, at 4:56 AM, Bill Fischofer <bill.fischofer@linaro.org> wrote:

> 

> On Mon, Apr 24, 2017 at 9:46 AM, Dmitry Eremin-Solenikov <

> dmitry.ereminsolenikov@linaro.org> wrote:

> 

>> Add proper handling for errors returned by odp_packet_copy_from_pkt().

>> 

>> Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>

>> 

> 

> Reviewed-by: Bill Fischofer <bill.fischofer@linaro.org>

> 

> 

>> ---

>> platform/linux-generic/odp_crypto.c | 24 ++++++++++++++++++++----

>> 1 file changed, 20 insertions(+), 4 deletions(-)

>> 

>> diff --git a/platform/linux-generic/odp_crypto.c

>> b/platform/linux-generic/odp_crypto.c

>> index 54b222fd..83122800 100644

>> --- a/platform/linux-generic/odp_crypto.c

>> +++ b/platform/linux-generic/odp_crypto.c

>> @@ -871,14 +871,17 @@ odp_crypto_operation(odp_crypto_op_param_t *param,

>>        odp_crypto_alg_err_t rc_auth = ODP_CRYPTO_ALG_ERR_NONE;

>>        odp_crypto_generic_session_t *session;

>>        odp_crypto_op_result_t local_result;

>> +       odp_bool_t allocated = false;

>> 

>>        session = (odp_crypto_generic_session_t *)(intptr_t)param->session;

>> 

>>        /* Resolve output buffer */

>>        if (ODP_PACKET_INVALID == param->out_pkt &&

>> -           ODP_POOL_INVALID != session->p.output_pool)

>> +           ODP_POOL_INVALID != session->p.output_pool) {

>>                param->out_pkt = odp_packet_alloc(session->p.output_pool,

>>                                odp_packet_len(param->pkt));

>> +               allocated = true;

>> +       }

>> 

>>        if (odp_unlikely(ODP_PACKET_INVALID == param->out_pkt)) {

>>                ODP_DBG("Alloc failed.\n");

>> @@ -886,11 +889,16 @@ odp_crypto_operation(odp_crypto_op_param_t *param,

>>        }

>> 

>>        if (param->pkt != param->out_pkt) {

>> -               (void)odp_packet_copy_from_pkt(param->out_pkt,

>> +               int ret;

>> +

>> +               ret = odp_packet_copy_from_pkt(param->out_pkt,

>>                                               0,

>>                                               param->pkt,

>>                                               0,

>>                                               odp_packet_len(param->pkt));

>> +               if (odp_unlikely(ret < 0))

>> +                       goto err;

>> +

>>                _odp_packet_copy_md_to_packet(param->pkt, param->out_pkt);

>>                odp_packet_free(param->pkt);

>>                param->pkt = ODP_PACKET_INVALID;

>> @@ -932,7 +940,7 @@ odp_crypto_operation(odp_crypto_op_param_t *param,

>>                op_result->result = local_result;

>>                if (odp_queue_enq(session->p.compl_queue,

>> completion_event)) {

>>                        odp_event_free(completion_event);

>> -                       return -1;

>> +                       goto err;

>>                }

>> 

>>                /* Indicate to caller operation was async */

>> @@ -940,13 +948,21 @@ odp_crypto_operation(odp_crypto_op_param_t *param,

>>        } else {

>>                /* Synchronous, simply return results */

>>                if (!result)

>> -                       return -1;

>> +                       goto err;

>>                *result = local_result;

>> 

>>                /* Indicate to caller operation was sync */

>>                *posted = 0;

>>        }

>>        return 0;

>> +

>> +err:

>> +       if (allocated) {

>> +               odp_packet_free(param->out_pkt);

>> +               param->out_pkt = ODP_PACKET_INVALID;

>> +       }

>> +

>> +       return -1;

>> }

>> 

>> static void ODP_UNUSED openssl_thread_id(CRYPTO_THREADID ODP_UNUSED *id)

>> --

>> 2.11.0

>> 

>>
diff mbox

Patch

diff --git a/platform/linux-generic/odp_crypto.c b/platform/linux-generic/odp_crypto.c
index 54b222fd..83122800 100644
--- a/platform/linux-generic/odp_crypto.c
+++ b/platform/linux-generic/odp_crypto.c
@@ -871,14 +871,17 @@  odp_crypto_operation(odp_crypto_op_param_t *param,
 	odp_crypto_alg_err_t rc_auth = ODP_CRYPTO_ALG_ERR_NONE;
 	odp_crypto_generic_session_t *session;
 	odp_crypto_op_result_t local_result;
+	odp_bool_t allocated = false;
 
 	session = (odp_crypto_generic_session_t *)(intptr_t)param->session;
 
 	/* Resolve output buffer */
 	if (ODP_PACKET_INVALID == param->out_pkt &&
-	    ODP_POOL_INVALID != session->p.output_pool)
+	    ODP_POOL_INVALID != session->p.output_pool) {
 		param->out_pkt = odp_packet_alloc(session->p.output_pool,
 				odp_packet_len(param->pkt));
+		allocated = true;
+	}
 
 	if (odp_unlikely(ODP_PACKET_INVALID == param->out_pkt)) {
 		ODP_DBG("Alloc failed.\n");
@@ -886,11 +889,16 @@  odp_crypto_operation(odp_crypto_op_param_t *param,
 	}
 
 	if (param->pkt != param->out_pkt) {
-		(void)odp_packet_copy_from_pkt(param->out_pkt,
+		int ret;
+
+		ret = odp_packet_copy_from_pkt(param->out_pkt,
 					       0,
 					       param->pkt,
 					       0,
 					       odp_packet_len(param->pkt));
+		if (odp_unlikely(ret < 0))
+			goto err;
+
 		_odp_packet_copy_md_to_packet(param->pkt, param->out_pkt);
 		odp_packet_free(param->pkt);
 		param->pkt = ODP_PACKET_INVALID;
@@ -932,7 +940,7 @@  odp_crypto_operation(odp_crypto_op_param_t *param,
 		op_result->result = local_result;
 		if (odp_queue_enq(session->p.compl_queue, completion_event)) {
 			odp_event_free(completion_event);
-			return -1;
+			goto err;
 		}
 
 		/* Indicate to caller operation was async */
@@ -940,13 +948,21 @@  odp_crypto_operation(odp_crypto_op_param_t *param,
 	} else {
 		/* Synchronous, simply return results */
 		if (!result)
-			return -1;
+			goto err;
 		*result = local_result;
 
 		/* Indicate to caller operation was sync */
 		*posted = 0;
 	}
 	return 0;
+
+err:
+	if (allocated) {
+		odp_packet_free(param->out_pkt);
+		param->out_pkt = ODP_PACKET_INVALID;
+	}
+
+	return -1;
 }
 
 static void ODP_UNUSED openssl_thread_id(CRYPTO_THREADID ODP_UNUSED *id)