Hi, I pushed the 2nd version of patches. I hope I understood all your comments well.
Many thanks, Lukasz W dniu 07.04.2020 o 08:20, Anoob Joseph pisze: > Hi Lukasz, > > Please see inline. > > Thanks, > Anoob > >> -----Original Message----- >> From: Lukasz Wojciechowski <l.wojciec...@partner.samsung.com> >> Sent: Tuesday, April 7, 2020 12:19 AM >> To: Anoob Joseph <ano...@marvell.com>; dev@dpdk.org >> Cc: Narayana Prasad Raju Athreya <pathr...@marvell.com>; Lukas Bartosik [C] >> <lbarto...@marvell.com> >> Subject: Re: [EXT] Re: [dpdk-dev] [PATCH 01/13] librte_security: fix >> verification >> of parameters >> >> Dear Anoob, >> >> Thank you for your reply and hints. > [Anoob] No mention! > >> Now I have patches ready to send as version 2, but I hesitate, because I >> don't >> like the idea of placing all checks in #ifdefs for RTE_LIBRTE_SECURITY_DEBUG >> config option. >> >> Let me explain here why: The config flag as a debug one will be disabled by >> default, which means, that normally nobody will use the checks. >> I believe that it is much better to have checks enabled as most of them will >> save >> the user of librte_security from segmentation faults, when trying to run >> instance->ops functions that are not supported or use invalid mempool >> object. I >> believe it will cause much less trouble to verify the error codes than to >> fight the >> segfault. > [Anoob] No disagreement. In fact this is exactly what is done with control > path APIs. But for datapath APIs, the penalty of such checks is not trivial. > I believe that's the argument for having the DEBUG config option in ethdev > data path ops. Also, for cases like instance->ops being NULL, the user would > get a seg fault with the first call itself and he can enable the config > option to debug the segfault he is observing. > > As for invalid mempool object, I do agree that is one case where we are > better off with per packet checks, but still perf impact would be there. In > ethdev, the library doesn't do these checks and it would be upto the driver > to have these checks if required. Same is the case with > rte_cryptodev_enqueue_burst(). > >> It is also mentioned in the API description in few places that specific >> codes are >> returned in case some operation is not supported. Can we make such a changes >> in API, changing the current behavior from an error return code to >> segmentation >> fault during execution? > [Anoob] Did you mean, if we have to allow seg fault as a valid error case, > better document it and remove the error codes getting returned? Again, I'm > not sure whether we can document that seg fault is the error case. Atleast, > in ethdev improper conditions can lead to seg fault but is not documented. > May be, maintainers should comment on it. > >> That's why I would like to keep all of the checks enabled and not placed >> inside >> config option. >> >> However it would be nice to add the RTE_LIBRTE_SECURITY_DEBUG flag that >> you mentioned for changing checks behavior, to additionally provide logs of >> checks. This way a devloper using libret_security won't get a segmentation >> faults but error codes. If [s]he wants to check the details he'll rebuild >> the library >> with debug config option enabled and will be able to see all the details in >> logs, >> so [s]he will be able to fix the code. >> >> What do you think about such usage of the config debug flag? > [Anoob] I totally agree to your suggestions on preventing seg faults. But my > only concern is the additional check and the corresponding perf penalty. > > May be let's look at the APIs and discuss what need to be handled how, > > int > rte_security_set_pkt_metadata(struct rte_security_ctx *instance, > struct rte_security_session *sess, > struct rte_mbuf *mb, void *params); > > instance -> NULL checks under config option > sess -> NULL checks under config option > mb -> possibly a datapath check. But can leave it to driver as well. > (rte_cryptodev_enqueue_burst() also doesn't do these checks). > Params -> can be NULL (so no check required). > > __rte_experimental > void * > rte_security_get_userdata(struct rte_security_ctx *instance, uint64_t md); > > instance -> NULL checks under config option > md -> can be NULL (device specific values). > > Does this make sense to you? > >> Best regards >> >> Lukasz >> >> >> W dniu 05.04.2020 o 14:54, Anoob Joseph pisze: >> >>> Hi Lukasz, >>> >>> Please see inline. >>> >>> Thanks, >>> Anoob >>> >>>> -----Original Message----- >>>> From: Lukasz Wojciechowski <l.wojciec...@partner.samsung.com> >>>> Sent: Saturday, April 4, 2020 12:06 AM >>>> To: Anoob Joseph <ano...@marvell.com>; dev@dpdk.org >>>> Cc: Narayana Prasad Raju Athreya <pathr...@marvell.com>; Lukas >>>> Bartosik [C] <lbarto...@marvell.com> >>>> Subject: [EXT] Re: [dpdk-dev] [PATCH 01/13] librte_security: fix >>>> verification of parameters >>>> >>>> External Email >>>> >>>> --------------------------------------------------------------------- >>>> - >>>> Hi Anoob, >>>> >>>> Thank you very much for your review. >>>> Please see my answers inline. >>>> >>>> Best regards, >>>> Lukasz >>>> >>>> >>>> W dniu 17.03.2020 o 13:59, Anoob Joseph pisze: >>>>> Hi Lukasz, >>>>> >>>>> Please see inline. >>>>> >>>>> Thanks, >>>>> Anoob >>>>> >>>>>> -----Original Message----- >>>>>> From: dev <dev-boun...@dpdk.org> On Behalf Of Lukasz Wojciechowski >>>>>> Sent: Thursday, March 12, 2020 8:47 PM >>>>>> To: dev@dpdk.org >>>>>> Subject: [dpdk-dev] [PATCH 01/13] librte_security: fix verification >>>>>> of parameters >>>>> [Anoob] I believe the title has to be: "security: fix verification of >> parameters" >>>>> Also, you can add "Fixes" as well. >>>> I changed the title and will push the new on in 2nd version of the >>>> paches after I'll fix all other issues. >>>> >>>> How do you add a "Fixes" tag to a patch? >>> [Anoob] >>> >>> Check the below link. It explains the format of the patch with fixes. >>> https://protect2.fireeye.com/url?k=457094cb-18a428a3-45711f84-0cc47a3356b2-a0d1cb1b92aa19e8&u=https://urldefense.proofpoint.com/v2/url?u=https-3A__protect2.fireeye. >>> com_url-3Fk-3D13e80549-2D4e769ea3-2D13e98e06-2D0cc47a6cba04- >> 2D78f48282 >>> e990b416-26q-3D1-26u-3Dhttps-253A-252F-252Fdoc.dpdk.org-252Fguides- >> 252 >>> Fcontributing-252Fpatches.html-2523commit-2Dmessages- >> 2Dbody&d=DwIDaQ&c >>> =nKjWec2b6R0mOyPaz7xtfQ&r=jPfB8rwwviRSxyLWs2n6B- >> WYLn1v9SyTMrT5EQqh2TU& >>> m=fTGxo5Mh9jPA0-xv8XSAtZpHD9TZebCJWW9PGcElYmA&s=g2HlI0z81E0M5- >> txF2U5Ag >>> xEg0l3MHs4JT0O8AiHvm8&e= >>> >>>>>> This patch adds verification of the parameters to the ret_security >>>>>> API >>>> functions. >>>>>> All required parameters are checked if they are not NULL. >>>>>> >>>>>> Checks verify full chain of pointers, e.g. in case of verification >>>>>> of >>>>>> "instance->ops- >>>>>>> session_XXX", they check also "instance" and "instance->ops". >>>>>> Signed-off-by: Lukasz Wojciechowski >>>>>> <l.wojciec...@partner.samsung.com> >>>>>> Change-Id: I1724c926a1a0a13fd16d76f19842a0b40fbea1b2 >>>>>> --- >>>>>> lib/librte_security/rte_security.c | 58 >>>>>> +++++++++++++++++++++++------- >>>>>> 1 file changed, 45 insertions(+), 13 deletions(-) >>>>>> >>>>>> diff --git a/lib/librte_security/rte_security.c >>>>>> b/lib/librte_security/rte_security.c >>>>>> index bc81ce15d..40a0e9ce5 100644 >>>>>> --- a/lib/librte_security/rte_security.c >>>>>> +++ b/lib/librte_security/rte_security.c >>>>>> @@ -1,6 +1,7 @@ >>>>>> /* SPDX-License-Identifier: BSD-3-Clause >>>>>> * Copyright 2017 NXP. >>>>>> * Copyright(c) 2017 Intel Corporation. >>>>>> + * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights >>>>>> + Reserved >>>>>> */ >>>>>> >>>>>> #include <rte_malloc.h> >>>>>> @@ -9,6 +10,12 @@ >>>>>> #include "rte_security.h" >>>>>> #include "rte_security_driver.h" >>>>>> >>>>>> +/* Macro to check for invalid pointers */ >>>>>> +#define RTE_PTR_OR_ERR_RET(ptr, retval) do { \ >>>>>> + if ((ptr) == NULL) \ >>>>>> + return retval; \ >>>>>> +} while (0) >>>>>> + >>>>>> struct rte_security_session * >>>>>> rte_security_session_create(struct rte_security_ctx *instance, >>>>>> struct rte_security_session_conf *conf, @@ >>>>>> -16,10 >>>>>> +23,11 @@ rte_security_session_create(struct rte_security_ctx >>>>>> +*instance, { >>>>>> struct rte_security_session *sess = NULL; >>>>>> >>>>>> - if (conf == NULL) >>>>>> - return NULL; >>>>>> - >>>>>> - RTE_FUNC_PTR_OR_ERR_RET(*instance->ops->session_create, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops->session_create, NULL); >>>>> [Anoob] The above three lines are repeated for every op NULL check. >>>>> Can we >>>> introduce one macro for doing all the three checks? In case if it >>>> doesn't come off well, we can stick to individual checks. >>>> Done. Will appear in 2nd version of patches. >>>>>> + RTE_PTR_OR_ERR_RET(conf, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(mp, NULL); >>>>>> >>>>>> if (rte_mempool_get(mp, (void **)&sess)) >>>>>> return NULL; >>>>>> @@ -38,14 +46,20 @@ rte_security_session_update(struct >>>>>> rte_security_ctx *instance, >>>>>> struct rte_security_session *sess, >>>>>> struct rte_security_session_conf *conf) { >>>>>> - RTE_FUNC_PTR_OR_ERR_RET(*instance->ops->session_update, - >>>>>> ENOTSUP); >>>>>> + RTE_PTR_OR_ERR_RET(instance, -EINVAL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops, -EINVAL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops->session_update, -ENOTSUP); >>>>>> + RTE_PTR_OR_ERR_RET(sess, -EINVAL); >>>>>> + RTE_PTR_OR_ERR_RET(conf, -EINVAL); >>>>>> return instance->ops->session_update(instance->device, sess, >>>>>> conf); } >>>>>> >>>>>> unsigned int >>>>>> rte_security_session_get_size(struct rte_security_ctx *instance) { >>>>>> - RTE_FUNC_PTR_OR_ERR_RET(*instance->ops->session_get_size, 0); >>>>>> + RTE_PTR_OR_ERR_RET(instance, 0); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops, 0); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops->session_get_size, 0); >>>>>> return instance->ops->session_get_size(instance->device); >>>>>> } >>>>>> >>>>>> @@ -54,7 +68,11 @@ rte_security_session_stats_get(struct >>>>>> rte_security_ctx *instance, >>>>>> struct rte_security_session *sess, >>>>>> struct rte_security_stats *stats) { >>>>>> - RTE_FUNC_PTR_OR_ERR_RET(*instance->ops->session_stats_get, - >>>>>> ENOTSUP); >>>>>> + RTE_PTR_OR_ERR_RET(instance, -EINVAL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops, -EINVAL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops->session_stats_get, -ENOTSUP); >>>>>> + // Parameter sess can be NULL in case of getting global >>>>>> statistics. >>>>> [Anoob] Checkpatch error. >>>>> ERROR:C99_COMMENTS: do not use C99 // comments >>>> Done. Will appear in 2nd version of patches. >>>>>> + RTE_PTR_OR_ERR_RET(stats, -EINVAL); >>>>>> return instance->ops->session_stats_get(instance->device, sess, >>>>>> stats); } >>>>>> >>>>>> @@ -64,7 +82,10 @@ rte_security_session_destroy(struct >>>>>> rte_security_ctx *instance, { >>>>>> int ret; >>>>>> >>>>>> - RTE_FUNC_PTR_OR_ERR_RET(*instance->ops->session_destroy, - >>>>>> ENOTSUP); >>>>>> + RTE_PTR_OR_ERR_RET(instance, -EINVAL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops, -EINVAL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops->session_destroy, -ENOTSUP); >>>>>> + RTE_PTR_OR_ERR_RET(sess, -EINVAL); >>>>>> >>>>>> if (instance->sess_cnt) >>>>>> instance->sess_cnt--; >>>>>> @@ -81,7 +102,11 @@ rte_security_set_pkt_metadata(struct >>>>>> rte_security_ctx *instance, >>>>>> struct rte_security_session *sess, >>>>>> struct rte_mbuf *m, void *params) { >>>>>> - RTE_FUNC_PTR_OR_ERR_RET(*instance->ops->set_pkt_metadata, - >>>>>> ENOTSUP); >>>>>> + RTE_PTR_OR_ERR_RET(instance, -EINVAL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops, -EINVAL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops->set_pkt_metadata, -ENOTSUP); >>>>> [Anoob] set_pkt_metadata() and get_userdata() are datapath ops. So >>>>> can you >>>> introduce a config option to enable/disable the checks. >>>>> Please check, >>>>> https://urldefense.proofpoint.com/v2/url?u=https- >> 3A__protect2.fireeye.com_url-3Fk-3Deee8020a-2Db37699e0-2Deee98945- >> 2D0cc47a6cba04-2D561954f3424eceea-26q-3D1-26u-3Dhttps-253A-252F- >> 252Furldefense.proofpoint.com-252Fv2-252Furl-253Fu-253Dhttps-2D3A-5F- >> 5Fprotect2.fireeye&d=DwIDaQ&c=nKjWec2b6R0mOyPaz7xtfQ&r=jPfB8rwwviRS >> xyLWs2n6B-WYLn1v9SyTMrT5EQqh2TU&m=fTGxo5Mh9jPA0- >> xv8XSAtZpHD9TZebCJWW9PGcElYmA&s=vENm9fIBE5DENCAaeYTeYFwK__g06Jv >> K-lyOiJh-VL0&e= . >>>>> com_url-3Fk-3Dc52d8c32-2D98e14097-2Dc52c077d-2D0cc47a30d446- >>>> 2Dc1b9d873 >>>>> e3e59cc4-26u-3Dhttp-3A__code.dpdk.org_dpdk_latest_source_lib_librte- >>>>> 5F >>>>> ethdev_rte-5Fethdev.h- >>>> 23L4372&d=DwIDaQ&c=nKjWec2b6R0mOyPaz7xtfQ&r=jPfB >>>>> 8rwwviRSxyLWs2n6B- >>>> WYLn1v9SyTMrT5EQqh2TU&m=aTo18FDvqHQBghOAhbi7x0f6EuX7 >>>> >> wZHTUtsRRloZ9Bw&s=TXpv6uQZW1WwB_Av3vCaHeUaibQzA0ypUUqnPy5aQlE >>>> &e= >>>> Could you explain a bit further? >>>> >>>> Do you propose to make checks inside #ifdef RTE_LIBRTE_SECURITY_DEBUG >>>> or so? >>> [Anoob] Yes. You will need to introduce a new config flag >> (RTE_LIBRTE_SECURITY_DEBUG) and based on that, the error checks can be >> enabled/disabled. >>>> And do you have all checks or just sess and m on mind? >>> [Anoob] I think we should have all checks under the config option. >>> >>>> The instance->ops->function checks were already there without any >>>> config options in all API functions. >>> [Anoob] Must have slipped through. Thanks for pointing it out. >>> >>>>>> + RTE_PTR_OR_ERR_RET(sess, -EINVAL); >>>>>> + RTE_PTR_OR_ERR_RET(m, -EINVAL); >>>>>> return instance->ops->set_pkt_metadata(instance->device, >>>>>> sess, m, params); >>>>>> } >>>>>> @@ -91,7 +116,9 @@ rte_security_get_userdata(struct >>>>>> rte_security_ctx *instance, uint64_t md) { >>>>>> void *userdata = NULL; >>>>>> >>>>>> - RTE_FUNC_PTR_OR_ERR_RET(*instance->ops->get_userdata, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops->get_userdata, NULL); >>>>>> if (instance->ops->get_userdata(instance->device, md, >>>>>> &userdata)) >>>>>> return NULL; >>>>>> >>>>>> @@ -101,7 +128,9 @@ rte_security_get_userdata(struct >>>>>> rte_security_ctx *instance, uint64_t md) const struct >>>>>> rte_security_capability * rte_security_capabilities_get(struct >> rte_security_ctx *instance) { >>>>>> - RTE_FUNC_PTR_OR_ERR_RET(*instance->ops->capabilities_get, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops->capabilities_get, NULL); >>>>>> return instance->ops->capabilities_get(instance->device); >>>>>> } >>>>>> >>>>>> @@ -113,7 +142,10 @@ rte_security_capability_get(struct >>>>>> rte_security_ctx *instance, >>>>>> const struct rte_security_capability *capability; >>>>>> uint16_t i = 0; >>>>>> >>>>>> - RTE_FUNC_PTR_OR_ERR_RET(*instance->ops->capabilities_get, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(instance->ops->capabilities_get, NULL); >>>>>> + RTE_PTR_OR_ERR_RET(idx, NULL); >>>>>> capabilities = >>>>>> instance->ops->capabilities_get(instance->device); >>>>>> >>>>>> if (capabilities == NULL) >>>>>> @@ -121,7 +153,7 @@ rte_security_capability_get(struct >>>>>> rte_security_ctx *instance, >>>>>> >>>>>> while ((capability = &capabilities[i++])->action >>>>>> != RTE_SECURITY_ACTION_TYPE_NONE) { >>>>>> - if (capability->action == idx->action && >>>>>> + if (capability->action == idx->action && >>>>>> capability->protocol == idx->protocol) { >>>>>> if (idx->protocol == >>>>>> RTE_SECURITY_PROTOCOL_IPSEC) >>>> { >>>>>> if (capability->ipsec.proto == >>>>>> -- >>>>>> 2.17.1 >>>> -- >>>> >>>> Lukasz Wojciechowski >>>> Principal Software Engineer >>>> >>>> Samsung R&D Institute Poland >>>> Samsung Electronics >>>> Office +48 22 377 88 25 >>>> l.wojciec...@partner.samsung.com >> -- >> >> Lukasz Wojciechowski >> Principal Software Engineer >> >> Samsung R&D Institute Poland >> Samsung Electronics >> Office +48 22 377 88 25 >> l.wojciec...@partner.samsung.com -- Lukasz Wojciechowski Principal Software Engineer Samsung R&D Institute Poland Samsung Electronics Office +48 22 377 88 25 l.wojciec...@partner.samsung.com