From f82f705b635d31a63446a16bc4526dbebf293c5a Mon Sep 17 00:00:00 2001 From: Olivier Matz Date: Wed, 6 Apr 2016 15:27:58 +0200 Subject: [PATCH] lpm: fix allocation of an existing object Change rte_lpm*_create() functions to return NULL and set rte_errno to EEXIST when the object name already exists. This is the behavior described in the API documentation in the header file. These functions were returning a pointer to the existing object in that case, but it is a problem as the caller did not know if the object had to be freed or not. Doing this change also makes the lpm API more consistent with the other APIs (mempool, rings, ...). Fixes: 916e4f4f4e ("memory: fix for multi process support") Signed-off-by: Olivier Matz Acked-by: Pablo de Lara --- app/test/test_lpm6.c | 2 +- doc/guides/rel_notes/release_16_04.rst | 9 +++++++++ lib/librte_lpm/rte_lpm.c | 10 ++++++++-- lib/librte_lpm/rte_lpm6.c | 5 ++++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/app/test/test_lpm6.c b/app/test/test_lpm6.c index 1f88d7ad46..b464342c26 100644 --- a/app/test/test_lpm6.c +++ b/app/test/test_lpm6.c @@ -222,7 +222,7 @@ test1(void) /* rte_lpm6_create: lpm name == LPM2 */ lpm3 = rte_lpm6_create("LPM1", SOCKET_ID_ANY, &config); - TEST_LPM_ASSERT(lpm3 == lpm1); + TEST_LPM_ASSERT(lpm3 == NULL); rte_lpm6_free(lpm1); rte_lpm6_free(lpm2); diff --git a/doc/guides/rel_notes/release_16_04.rst b/doc/guides/rel_notes/release_16_04.rst index 1acc63a527..b0f3dbabf4 100644 --- a/doc/guides/rel_notes/release_16_04.rst +++ b/doc/guides/rel_notes/release_16_04.rst @@ -434,6 +434,15 @@ Libraries however a custom compare function (not in the jump table) can only be used in single-process mode. +* **lpm: Fixed return value when allocating an existing object.** + + Changed the ``rte_lpm*_create()`` functions to return ``NULL`` and set + ``rte_errno`` to ``EEXIST`` when the object name already exists. This is + the behavior described in the API documentation in the header file. + The previous behavior was to return a pointer to the existing object in + that case, preventing the caller to know if the object had to be freed + or not. + * **librte_port: Fixed segmentation fault for ring and ethdev writer nodrop.** Fixed core dump issue on txq and swq when dropless is set to yes. diff --git a/lib/librte_lpm/rte_lpm.c b/lib/librte_lpm/rte_lpm.c index bd3563f3a8..8bdf60657f 100644 --- a/lib/librte_lpm/rte_lpm.c +++ b/lib/librte_lpm/rte_lpm.c @@ -209,8 +209,11 @@ rte_lpm_create_v20(const char *name, int socket_id, int max_rules, if (strncmp(name, lpm->name, RTE_LPM_NAMESIZE) == 0) break; } - if (te != NULL) + lpm = NULL; + if (te != NULL) { + rte_errno = EEXIST; goto exit; + } /* allocate tailq entry */ te = rte_zmalloc("LPM_TAILQ_ENTRY", sizeof(*te), 0); @@ -280,8 +283,11 @@ rte_lpm_create_v1604(const char *name, int socket_id, if (strncmp(name, lpm->name, RTE_LPM_NAMESIZE) == 0) break; } - if (te != NULL) + lpm = NULL; + if (te != NULL) { + rte_errno = EEXIST; goto exit; + } /* allocate tailq entry */ te = rte_zmalloc("LPM_TAILQ_ENTRY", sizeof(*te), 0); diff --git a/lib/librte_lpm/rte_lpm6.c b/lib/librte_lpm/rte_lpm6.c index 4c44cd7541..ba4353cedf 100644 --- a/lib/librte_lpm/rte_lpm6.c +++ b/lib/librte_lpm/rte_lpm6.c @@ -182,8 +182,11 @@ rte_lpm6_create(const char *name, int socket_id, if (strncmp(name, lpm->name, RTE_LPM6_NAMESIZE) == 0) break; } - if (te != NULL) + lpm = NULL; + if (te != NULL) { + rte_errno = EEXIST; goto exit; + } /* allocate tailq entry */ te = rte_zmalloc("LPM6_TAILQ_ENTRY", sizeof(*te), 0); -- 2.20.1