From bc1a35fb3f5e08cfd62607a98c1bf8a48c231f5a Mon Sep 17 00:00:00 2001 From: David Marchand Date: Tue, 12 Oct 2021 21:39:26 +0200 Subject: [PATCH] memzone: enforce valid flags when reserving If we do not enforce valid flags are passed by an application, this application might face issues in the future when we add more flags. Signed-off-by: David Marchand Acked-by: Stephen Hemminger Acked-by: Andrew Rybchenko Acked-by: Ray Kinsella --- app/test/test_memzone.c | 24 ++++++++++++++++++++++++ lib/eal/common/eal_common_memzone.c | 17 +++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/app/test/test_memzone.c b/app/test/test_memzone.c index 27b8b52fcd..6ddd0fbab5 100644 --- a/app/test/test_memzone.c +++ b/app/test/test_memzone.c @@ -82,6 +82,26 @@ test_memzone_invalid_alignment(void) return 0; } +static int +test_memzone_invalid_flags(void) +{ + const struct rte_memzone *mz; + + mz = rte_memzone_lookup(TEST_MEMZONE_NAME("invalid_flags")); + if (mz != NULL) { + printf("Zone with invalid flags has been reserved\n"); + return -1; + } + + mz = rte_memzone_reserve(TEST_MEMZONE_NAME("invalid_flags"), + 100, SOCKET_ID_ANY, RTE_MEMZONE_IOVA_CONTIG << 1); + if (mz != NULL) { + printf("Zone with invalid flags has been reserved\n"); + return -1; + } + return 0; +} + static int test_memzone_reserving_zone_size_bigger_than_the_maximum(void) { @@ -1106,6 +1126,10 @@ test_memzone(void) if (test_memzone_invalid_alignment() < 0) return -1; + printf("test invalid flags for memzone_reserve\n"); + if (test_memzone_invalid_flags() < 0) + return -1; + printf("test reserving the largest size memzone possible\n"); if (test_memzone_reserve_max() < 0) return -1; diff --git a/lib/eal/common/eal_common_memzone.c b/lib/eal/common/eal_common_memzone.c index 7c21aa921e..ecde9441ee 100644 --- a/lib/eal/common/eal_common_memzone.c +++ b/lib/eal/common/eal_common_memzone.c @@ -53,6 +53,18 @@ memzone_lookup_thread_unsafe(const char *name) return NULL; } +#define MEMZONE_KNOWN_FLAGS (RTE_MEMZONE_2MB \ + | RTE_MEMZONE_1GB \ + | RTE_MEMZONE_16MB \ + | RTE_MEMZONE_16GB \ + | RTE_MEMZONE_256KB \ + | RTE_MEMZONE_256MB \ + | RTE_MEMZONE_512MB \ + | RTE_MEMZONE_4GB \ + | RTE_MEMZONE_SIZE_HINT_ONLY \ + | RTE_MEMZONE_IOVA_CONTIG \ + ) + static const struct rte_memzone * memzone_reserve_aligned_thread_unsafe(const char *name, size_t len, int socket_id, unsigned int flags, unsigned int align, @@ -128,6 +140,11 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len, return NULL; } + if ((flags & ~MEMZONE_KNOWN_FLAGS) != 0) { + rte_errno = EINVAL; + return NULL; + } + /* only set socket to SOCKET_ID_ANY if we aren't allocating for an * external heap. */ -- 2.20.1