Regards, Bala
On 22 April 2017 at 22:15, Dmitry Eremin-Solenikov <dmitry.ereminsoleni...@linaro.org> wrote: > Add proper handling for errors returned by odp_packet_copy_from_pkt(). > > Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsoleni...@linaro.org> > --- > platform/linux-generic/odp_crypto.c | 22 +++++++++++++++++++--- > 1 file changed, 19 insertions(+), 3 deletions(-) > > diff --git a/platform/linux-generic/odp_crypto.c > b/platform/linux-generic/odp_crypto.c > index 54b222fd..aaf5931d 100644 > --- a/platform/linux-generic/odp_crypto.c > +++ b/platform/linux-generic/odp_crypto.c > @@ -871,6 +871,7 @@ 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; > > @@ -885,12 +886,19 @@ odp_crypto_operation(odp_crypto_op_param_t *param, > return -1; > } > > + allocated = true; This boolean 'allocated' should come inside the if condition where you allocate the packet. During "in place" encryption the out_pkt is same as input packet in which case the odp_crypto_operation should not free the packet during error. Since in that case the packet was allocated by the application it may need to resubmit the packet for further crypto operation. > + > 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 >