The rte_cpuset_t type cannot handle core ids greater than CPU_SETSIZE
Add an explicit check for out of range values when processes a corelist.

Signed-off-by: Bruce Richardson <[email protected]>
---
 app/test/test_argparse.c    | 10 ++++++++++
 lib/argparse/rte_argparse.c |  5 +++++
 2 files changed, 15 insertions(+)

diff --git a/app/test/test_argparse.c b/app/test/test_argparse.c
index fdc6dd113c..318f8df9fb 100644
--- a/app/test/test_argparse.c
+++ b/app/test/test_argparse.c
@@ -834,9 +834,13 @@ test_argparse_parse_type_corelist(void)
        char *corelist_invalid_special_chars = test_strdup("1,2@3");
        char *corelist_invalid_comma_only = test_strdup(",");
        char *corelist_invalid_out_of_range = test_strdup("70000");
+       char corelist_invalid_cpu_set[32];
        rte_cpuset_t val_cpuset;
        int ret;
 
+       snprintf(corelist_invalid_cpu_set, sizeof(corelist_invalid_cpu_set),
+               "0-%d", CPU_SETSIZE);
+
        /* test valid single core */
        CPU_ZERO(&val_cpuset);
        ret = rte_argparse_parse_type(corelist_valid_single,
@@ -966,6 +970,12 @@ test_argparse_parse_type_corelist(void)
                        RTE_ARGPARSE_VALUE_TYPE_CORELIST, &val_cpuset);
        TEST_ASSERT(ret != 0, "Argparse parse type for corelist (out of range) 
should have failed!");
 
+       /* test invalid corelist that exceeds the destination CPU set */
+       CPU_ZERO(&val_cpuset);
+       ret = rte_argparse_parse_type(corelist_invalid_cpu_set,
+                       RTE_ARGPARSE_VALUE_TYPE_CORELIST, &val_cpuset);
+       TEST_ASSERT(ret != 0, "Argparse parse type for corelist outside CPU set 
should have failed!");
+
        return 0;
 }
 
diff --git a/lib/argparse/rte_argparse.c b/lib/argparse/rte_argparse.c
index 88c3e7740c..158c413bdc 100644
--- a/lib/argparse/rte_argparse.c
+++ b/lib/argparse/rte_argparse.c
@@ -623,6 +623,11 @@ parse_arg_corelist(const struct rte_argparse_arg *arg, 
const char *value)
                                /* range from low to high */
                                max = idx;
                        }
+                       if (max >= CPU_SETSIZE) {
+                               ARGPARSE_LOG(ERR, "argument %s contains a core 
outside the CPU set range!",
+                                       arg->name_long);
+                               return -EINVAL;
+                       }
 
                        for (; min <= max; min++)
                                CPU_SET(min, cpuset);
-- 
2.53.0

Reply via email to