The code to parse arguments like memory size, channels and rank
was using atoi() which has no check for garbage after the number.
Switch to using a helper that uses strtoull().

Signed-off-by: Stephen Hemminger <[email protected]>
---
 lib/eal/common/eal_common_options.c | 44 +++++++++++++++++++++++++----
 1 file changed, 39 insertions(+), 5 deletions(-)

diff --git a/lib/eal/common/eal_common_options.c 
b/lib/eal/common/eal_common_options.c
index 1049838d73..49151c0a16 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -2062,6 +2062,29 @@ eal_parse_huge_worker_stack(const char *arg)
        return 0;
 }
 
+static int
+eal_parse_num(const char *str, unsigned int *val)
+{
+       char *endptr;
+       unsigned long long n;
+
+       while (isspace((unsigned char)*str))
+               str++;
+
+       if (*str == '-')
+               return -1;
+
+       errno = 0;
+       n = strtoull(str, &endptr, 10);
+
+       /* Error if string is empty or has trailing characters */
+       if (*str == '\0' || *endptr != '\0' || errno != 0 || n > UINT_MAX)
+               return -1;
+
+       *val = n;
+       return 0;
+}
+
 /* Parse the arguments given in the command line of the application */
 int
 eal_parse_args(void)
@@ -2205,23 +2228,34 @@ eal_parse_args(void)
 
        /* memory options */
        if (args.memory_size != NULL) {
-               int_cfg->memory = atoi(args.memory_size);
+               unsigned int mb;
+               if (eal_parse_num(args.memory_size, &mb) < 0) {
+                       EAL_LOG(ERR, "invalid memory size parameter");
+                       return -1;
+               }
+
+               int_cfg->memory = mb;
                int_cfg->memory *= 1024ULL;
                int_cfg->memory *= 1024ULL;
        }
        if (args.memory_channels != NULL) {
-               int_cfg->force_nchannel = atoi(args.memory_channels);
-               if (int_cfg->force_nchannel == 0) {
+               unsigned int n;
+               if (eal_parse_num(args.memory_channels, &n) < 0 ||
+                       n == 0 || n > 32) {
                        EAL_LOG(ERR, "invalid memory channel parameter");
                        return -1;
                }
+               int_cfg->force_nchannel = n;
        }
        if (args.memory_ranks != NULL) {
-               int_cfg->force_nrank = atoi(args.memory_ranks);
-               if (int_cfg->force_nrank == 0 || int_cfg->force_nrank > 16) {
+               unsigned int n;
+
+               if (eal_parse_num(args.memory_ranks, &n) < 0 ||
+                       n == 0 || n > 16) {
                        EAL_LOG(ERR, "invalid memory rank parameter");
                        return -1;
                }
+               int_cfg->force_nrank = n;
        }
        if (args.no_huge) {
                int_cfg->no_hugetlbfs = 1;
-- 
2.53.0

Reply via email to