]> git.sur5r.net Git - u-boot/commitdiff
cmd: mtdparts: fix null pointer dereference in parse_mtdparts
authorLadislav Michl <ladis@linux-mips.org>
Tue, 12 Jul 2016 18:28:23 +0000 (20:28 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 22 Jul 2016 18:46:13 +0000 (14:46 -0400)
In case there is no mtdparts variable in relocated environment,
NULL is assigned to p, which is later fed to strncpy.
Also function parameter mtdparts is completely ignored, so use it
in case mtdparts variable is not found in environment. This
parameter is checked not to be NULL in caller.

Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
cmd/mtdparts.c

index 3a88a10ba3471f1f6fdc0cd10a3dd5912115c2ab..995cb87b73a477f7bdca12177e11930843b24d24 100644 (file)
@@ -1524,7 +1524,7 @@ static int spread_partitions(void)
  */
 static int parse_mtdparts(const char *const mtdparts)
 {
-       const char *p = mtdparts;
+       const char *p;
        struct mtd_device *dev;
        int err = 1;
        char tmp_parts[MTDPARTS_MAXLEN];
@@ -1538,20 +1538,25 @@ static int parse_mtdparts(const char *const mtdparts)
        }
 
        /* re-read 'mtdparts' variable, mtd_devices_init may be updating env */
-       if (gd->flags & GD_FLG_ENV_READY) {
+       if (gd->flags & GD_FLG_ENV_READY)
                p = getenv("mtdparts");
-       } else {
-               p = tmp_parts;
-               getenv_f("mtdparts", tmp_parts, MTDPARTS_MAXLEN);
+       else {
+               if (getenv_f("mtdparts", tmp_parts, MTDPARTS_MAXLEN) != -1)
+                       p = tmp_parts;
+               else
+                       p = NULL;
        }
 
+       if (!p)
+               p = mtdparts;
+
        if (strncmp(p, "mtdparts=", 9) != 0) {
                printf("mtdparts variable doesn't start with 'mtdparts='\n");
                return err;
        }
        p += 9;
 
-       while (p && (*p != '\0')) {
+       while (*p != '\0') {
                err = 1;
                if ((device_parse(p, &p, &dev) != 0) || (!dev))
                        break;
@@ -1569,12 +1574,10 @@ static int parse_mtdparts(const char *const mtdparts)
                list_add_tail(&dev->link, &devices);
                err = 0;
        }
-       if (err == 1) {
+       if (err == 1)
                device_delall(&devices);
-               return 1;
-       }
 
-       return 0;
+       return err;
 }
 
 /**