lib: strto: Stop detection when invalid char is used
authorMichal Simek <michal.simek@xilinx.com>
Wed, 8 Apr 2020 08:09:16 +0000 (10:09 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 24 Apr 2020 20:40:09 +0000 (16:40 -0400)
This issue has been found when mtd partition are specified. Autodetection
code should stop when the first invalid char is found.

Here is the example of commands:
setenv mtdids nand0=memory-controller@e000e000
setenv mtdparts "mtdparts=nand0:4m(boot),4m(env),64m(kernel),96m(rootfs)"
mtd list

Before:
Zynq> mtd list
List of MTD devices:
* nand0
  - type: NAND flash
  - block size: 0x20000 bytes
  - min I/O: 0x800 bytes
  - OOB size: 64 bytes
  - OOB available: 16 bytes
  - ECC strength: 1 bits
  - ECC step size: 2048 bytes
  - bitflip threshold: 1 bits
  - 0x000000000000-0x000010000000 : "nand0"
  - 0x000000000000-0x000000400000 : "boot"
  - 0x000000400000-0x000000800000 : "env"
  - 0x000000800000-0x000006c00000 : "kernel"
  - 0x000006c00000-0x000010000000 : "rootfs"

Where it is visible that kernel partition has 100m instead of 64m

After:
Zynq> mtd list
* nand0
  - type: NAND flash
  - block size: 0x20000 bytes
  - min I/O: 0x800 bytes
  - OOB size: 64 bytes
  - OOB available: 16 bytes
  - ECC strength: 1 bits
  - ECC step size: 2048 bytes
  - bitflip threshold: 1 bits
  - 0x000000000000-0x000010000000 : "nand0"
  - 0x000000000000-0x000000400000 : "boot"
  - 0x000000400000-0x000000800000 : "env"
  - 0x000000800000-0x000004800000 : "kernel"
  - 0x000004800000-0x00000a800000 : "rootfs"

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Fixes: 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16 detection")
Tested-by: Heiko Schocher <hs@denx.de>
Tested-by: Pali Rohár <pali@kernel.org>
lib/strto.c

index 1ac2b09c725ca24c788b819f679fac9e772642c2..606701566f3291824f8f71e7b182cdb79261d84b 100644 (file)
@@ -34,6 +34,9 @@ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
                                        *base = 16;
                                        break;
                                }
+
+                               if (!(var >= '0' && var <= '9'))
+                                       break;
                        } while (var);
                }
        }