> Subject: [EXT] [PATCH v2] cryptodev: avoid algorithm strings null > pointers > > The crypto algorithm strings identifiers that are Continuous may be > null, so there is needed to add null judgment. > When testing with dpdk-test-crypto-perf and passing in the parameter > --auth-algo sm3-hmac, The program caused a segfault due to a null > pointer passed in by strcmp. > Adding this patch can solve the segfault problem.
I believe this is a fix and you should add fixes tag for this and need to be backported. > > Signed-off-by: xixin.liu <liuxixin2...@outlook.com> Signoff format is not correct. Please follow https://doc.dpdk.org/guides/contributing/patches.html > --- > lib/cryptodev/rte_cryptodev.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/lib/cryptodev/rte_cryptodev.c > b/lib/cryptodev/rte_cryptodev.c index a96114b2da..41c23fc596 100644 > --- a/lib/cryptodev/rte_cryptodev.c > +++ b/lib/cryptodev/rte_cryptodev.c > @@ -346,6 +346,8 @@ rte_cryptodev_get_cipher_algo_enum(enum > rte_crypto_cipher_algorithm *algo_enum, > int ret = -1; /* Invalid string */ > > for (i = 1; i < RTE_DIM(crypto_cipher_algorithm_strings); i++) { > + if (crypto_cipher_algorithm_strings[i] == NULL) > + continue; crypto_cipher_algorithm_strings is a fixed size array with all non-NULL known values and the for loop is iterating over it. So, this check does not make sense to me. ----> Not every element of the array is defined, eg. it is NULL that the first element [1], if not check "strcmp(algo_string, crypto_cipher_algorithm_strings[i]" will fail > if (strcmp(algo_string, crypto_cipher_algorithm_strings[i]) == > 0) { > *algo_enum = (enum rte_crypto_cipher_algorithm) i; > ret = 0; > @@ -366,6 +368,8 @@ rte_cryptodev_get_auth_algo_enum(enum > rte_crypto_auth_algorithm *algo_enum, > int ret = -1; /* Invalid string */ > > for (i = 1; i < RTE_DIM(crypto_auth_algorithm_strings); i++) { > + if (crypto_auth_algorithm_strings[i] == NULL) > + continue; > if (strcmp(algo_string, crypto_auth_algorithm_strings[i]) == 0) > { > *algo_enum = (enum rte_crypto_auth_algorithm) i; > ret = 0; > @@ -386,6 +390,8 @@ rte_cryptodev_get_aead_algo_enum(enum > rte_crypto_aead_algorithm *algo_enum, > int ret = -1; /* Invalid string */ > > for (i = 1; i < RTE_DIM(crypto_aead_algorithm_strings); i++) { > + if (crypto_aead_algorithm_strings[i] == NULL) > + continue; > if (strcmp(algo_string, crypto_aead_algorithm_strings[i]) == 0) > { > *algo_enum = (enum rte_crypto_aead_algorithm) i; > ret = 0; > @@ -406,6 +412,8 @@ rte_cryptodev_asym_get_xform_enum(enum > rte_crypto_asym_xform_type *xform_enum, > int ret = -1; /* Invalid string */ > > for (i = 1; i < RTE_DIM(crypto_asym_xform_strings); i++) { > + if (crypto_asym_xform_strings[i] == NULL) > + continue; > if (strcmp(xform_string, > crypto_asym_xform_strings[i]) == 0) { > *xform_enum = (enum rte_crypto_asym_xform_type) i; > -- > 2.34.1