devargs: fix build with gcc 4.7
authorPablo de Lara <pablo.de.lara.guarch@intel.com>
Mon, 16 Jul 2018 06:26:27 +0000 (07:26 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 18 Jul 2018 08:36:30 +0000 (10:36 +0200)
Fixed possible out-of-bounds issue:

lib/librte_eal/common/eal_common_devargs.c:
In function ‘rte_devargs_layers_parse’:
lib/librte_eal/common/eal_common_devargs.c:121:7:
error: array subscript is above array bounds

Bugzilla ID: 71
Fixes: 338327d731e6 ("devargs: add function to parse device layers")

Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
Acked-by: Gaetan Rivet <gaetan.rivet@6wind.com>
lib/librte_eal/common/eal_common_devargs.c

index a22a200..1a7b00e 100644 (file)
@@ -118,12 +118,17 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
        }
 
        while (s != NULL) {
-               if (strncmp(layers[i].key, s,
-                           strlen(layers[i].key)) &&
-                   /* The last layer is free-form.
-                    * The "driver" key is not required (but accepted).
-                    */
-                   i != RTE_DIM(layers) - 1)
+               if (i >= RTE_DIM(layers)) {
+                       RTE_LOG(ERR, EAL, "Unrecognized layer %s\n", s);
+                       ret = -EINVAL;
+                       goto get_out;
+               }
+               /*
+                * The last layer is free-form.
+                * The "driver" key is not required (but accepted).
+                */
+               if (strncmp(layers[i].key, s, strlen(layers[i].key)) &&
+                               i != RTE_DIM(layers) - 1)
                        goto next_layer;
                layers[i].str = s;
                layers[i].kvlist = rte_kvargs_parse_delim(s, NULL, "/");
@@ -136,11 +141,6 @@ rte_devargs_layers_parse(struct rte_devargs *devargs,
                if (s != NULL)
                        s++;
 next_layer:
-               if (i >= RTE_DIM(layers)) {
-                       RTE_LOG(ERR, EAL, "Unrecognized layer %s\n", s);
-                       ret = -EINVAL;
-                       goto get_out;
-               }
                i++;
        }