DFU: Accept redundant spaces and tabs in dfu_alt_info
authorMasami Hiramatsu <masami.hiramatsu@linaro.org>
Mon, 31 Jan 2022 02:52:29 +0000 (11:52 +0900)
committerTom Rini <trini@konsulko.com>
Fri, 11 Feb 2022 16:29:23 +0000 (11:29 -0500)
If dfu_alt_info has repeated spaces or tab (for indentation or
readability), the dfu fails to parse it. For example, if
dfu_alt_info="mtd nor1=image raw  100000 200000" (double spaces
after "raw"), the image entity start address is '0' and the size
'0x100000'. This is because the repeated space is not skipped.

Use space and tab as a separater and apply skip_spaces() to
skip redundant spaces and tabs.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu@linaro.org>
drivers/dfu/dfu.c
drivers/dfu/dfu_mmc.c
drivers/dfu/dfu_mtd.c
drivers/dfu/dfu_nand.c
drivers/dfu/dfu_ram.c
drivers/dfu/dfu_sf.c

index 66c41b5e762f9905f453b9dd276930f77d950a70..18154774f9a24781518c1a54bc3d7d193690cbdf 100644 (file)
@@ -123,9 +123,10 @@ int dfu_config_interfaces(char *env)
        s = env;
        while (s) {
                ret = -EINVAL;
-               i = strsep(&s, " ");
+               i = strsep(&s, " \t");
                if (!i)
                        break;
+               s = skip_spaces(s);
                d = strsep(&s, "=");
                if (!d)
                        break;
@@ -502,8 +503,9 @@ static int dfu_fill_entity(struct dfu_entity *dfu, char *s, int alt,
        char *st;
 
        debug("%s: %s interface: %s dev: %s\n", __func__, s, interface, devstr);
-       st = strsep(&s, " ");
+       st = strsep(&s, " \t");
        strlcpy(dfu->name, st, DFU_NAME_SIZE);
+       s = skip_spaces(s);
 
        dfu->alt = alt;
        dfu->max_buf_size = 0;
index 3dab5a5f6335c532c65a4bbe77cde479dee63e0b..d747ede66c45009fec29b2d8d4f9b243784c1dd0 100644 (file)
@@ -351,11 +351,12 @@ int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s)
        dfu->data.mmc.dev_num = dectoul(devstr, NULL);
 
        for (; parg < argv + sizeof(argv) / sizeof(*argv); ++parg) {
-               *parg = strsep(&s, " ");
+               *parg = strsep(&s, " \t");
                if (*parg == NULL) {
                        pr_err("Invalid number of arguments.\n");
                        return -ENODEV;
                }
+               s = skip_spaces(s);
        }
 
        entity_type = argv[0];
@@ -390,9 +391,11 @@ int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s)
                 * specifying the mmc HW defined partition number
                 */
                if (s)
-                       if (!strcmp(strsep(&s, " "), "mmcpart"))
+                       if (!strcmp(strsep(&s, " \t"), "mmcpart")) {
+                               s = skip_spaces(s);
                                dfu->data.mmc.hw_partition =
                                        simple_strtoul(s, NULL, 0);
+                       }
 
        } else if (!strcmp(entity_type, "part")) {
                struct disk_partition partinfo;
@@ -412,8 +415,10 @@ int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s)
                 * specifying the mmc HW defined partition number
                 */
                if (s)
-                       if (!strcmp(strsep(&s, " "), "offset"))
+                       if (!strcmp(strsep(&s, " \t"), "offset")) {
+                               s = skip_spaces(s);
                                offset = simple_strtoul(s, NULL, 0);
+                       }
 
                dfu->layout                     = DFU_RAW_ADDR;
                dfu->data.mmc.lba_start         = partinfo.start + offset;
index cce9ce0845ee45986399520ae09f5a4a5056dc93..27c011f53797ee72fb747a92794a66aa6e1af8b3 100644 (file)
@@ -12,6 +12,7 @@
 #include <mtd.h>
 #include <jffs2/load_kernel.h>
 #include <linux/err.h>
+#include <linux/ctype.h>
 
 static bool mtd_is_aligned_with_block_size(struct mtd_info *mtd, u64 size)
 {
@@ -285,11 +286,14 @@ int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr, char *s)
        dfu->data.mtd.info = mtd;
        dfu->max_buf_size = mtd->erasesize;
 
-       st = strsep(&s, " ");
+       st = strsep(&s, " \t");
+       s = skip_spaces(s);
        if (!strcmp(st, "raw")) {
                dfu->layout = DFU_RAW_ADDR;
                dfu->data.mtd.start = hextoul(s, &s);
-               s++;
+               if (!isspace(*s))
+                       return -1;
+               s = skip_spaces(s);
                dfu->data.mtd.size = hextoul(s, &s);
        } else if ((!strcmp(st, "part")) || (!strcmp(st, "partubi"))) {
                char mtd_id[32];
index e53b35e42b8806b7738d4230927b29353bda514e..76761939ab530db2684daab76d5500e5c74ccb18 100644 (file)
@@ -201,11 +201,14 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr, char *s)
 
        dfu->data.nand.ubi = 0;
        dfu->dev_type = DFU_DEV_NAND;
-       st = strsep(&s, " ");
+       st = strsep(&s, " \t");
+       s = skip_spaces(s);
        if (!strcmp(st, "raw")) {
                dfu->layout = DFU_RAW_ADDR;
                dfu->data.nand.start = hextoul(s, &s);
-               s++;
+               if (!isspace(*s))
+                       return -1;
+               s = skip_spaces(s);
                dfu->data.nand.size = hextoul(s, &s);
        } else if ((!strcmp(st, "part")) || (!strcmp(st, "partubi"))) {
                char mtd_id[32];
@@ -216,7 +219,9 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr, char *s)
                dfu->layout = DFU_RAW_ADDR;
 
                dev = dectoul(s, &s);
-               s++;
+               if (!isspace(*s))
+                       return -1;
+               s = skip_spaces(s);
                part = dectoul(s, &s);
 
                sprintf(mtd_id, "%s%d,%d", "nand", dev, part - 1);
index cc7e45ba335d510eedd0e3bd769bd9884a7c6e30..361a3ff8af8217f91799f65e7a053fcc36c1c976 100644 (file)
@@ -60,11 +60,12 @@ int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, char *s)
        const char **parg = argv;
 
        for (; parg < argv + sizeof(argv) / sizeof(*argv); ++parg) {
-               *parg = strsep(&s, " ");
+               *parg = strsep(&s, " \t");
                if (*parg == NULL) {
                        pr_err("Invalid number of arguments.\n");
                        return -ENODEV;
                }
+               s = skip_spaces(s);
        }
 
        dfu->dev_type = DFU_DEV_RAM;
index b72493ced86dab8ddfc15eddbf873bee7f849da1..993e951bc3b9e9e253fece836d363c7b56c3847e 100644 (file)
@@ -13,6 +13,7 @@
 #include <spi_flash.h>
 #include <jffs2/load_kernel.h>
 #include <linux/mtd/mtd.h>
+#include <linux/ctype.h>
 
 static int dfu_get_medium_size_sf(struct dfu_entity *dfu, u64 *size)
 {
@@ -178,11 +179,14 @@ int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, char *s)
        dfu->dev_type = DFU_DEV_SF;
        dfu->max_buf_size = dfu->data.sf.dev->sector_size;
 
-       st = strsep(&s, " ");
+       st = strsep(&s, " \t");
+       s = skip_spaces(s);
        if (!strcmp(st, "raw")) {
                dfu->layout = DFU_RAW_ADDR;
                dfu->data.sf.start = hextoul(s, &s);
-               s++;
+               if (!isspace(*s))
+                       return -1;
+               s = skip_spaces(s);
                dfu->data.sf.size = hextoul(s, &s);
        } else if (CONFIG_IS_ENABLED(DFU_SF_PART) &&
                   (!strcmp(st, "part") || !strcmp(st, "partubi"))) {
@@ -195,7 +199,9 @@ int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, char *s)
                dfu->layout = DFU_RAW_ADDR;
 
                dev = dectoul(s, &s);
-               s++;
+               if (!isspace(*s))
+                       return -1;
+               s = skip_spaces(s);
                part = dectoul(s, &s);
 
                sprintf(mtd_id, "%s%d,%d", "nor", dev, part - 1);