mtd: parser: cmdline: Fix parsing of part-names with colons
PATCH 1/1 mtd: parser: cmdline: Fix parsing of part-names with colons
Some devices (especially QCA ones) are already using hardcoded partition names with colons in it. The OpenMesh A62 for example provides following mtd relevant information via cmdline:
root=31:11 mtdparts=spi0.0:256k(0:SBL1),128k(0:MIBIB),384k(0:QSEE),64k(0:CDT),64k(0:DDRPARAMS),64k(0:APPSBLENV),512k(0:APPSBL),64k(0:ART),64k(custom),64k(0:KEYS),0x002b0000(kernel),0x00c80000(rootfs),15552k(inactive) rootfsname=rootfs rootwait
The change to split only on the last colon between mtd-id and partitions will cause newpart to see following string for the first partition:
KEYS),0x002b0000(kernel),0x00c80000(rootfs),15552k(inactive)
Such a partition list cannot be parsed and thus the device fails to boot.
Avoid this behavior by making sure that the start of the first part-name ("(") will also be the last byte the mtd-id split algorithm is using for its colon search.
--- drivers/mtd/parsers/cmdlinepart.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/mtd/parsers/cmdlinepart.c +12 -1
@@ -226,7 +226,7 @@ static int mtdpart_setup_real(char *s)struct cmdline_mtd_partition *this_mtd;struct mtd_partition *parts;int mtd_id_len, num_parts; -char *p, *mtd_id, *semicol; +char *p, *mtd_id, *semicol, *open_parenth;/* * Replace the first ';' by a NULL char so strrchr can work
@@ -236,6 +236,13 @@ static int mtdpart_setup_real(char *s)if (semicol) *semicol ='\0' ; +/* make sure that part-names with ":" will not be handled as +* part of the mtd-id with an ":" +*/ + open_parenth =strchr (s,'(' ); +if (open_parenth) + *open_parenth ='\0' ; + mtd_id = s;/*
@@ -245,6 +252,10 @@ static int mtdpart_setup_real(char *s)*/ p =strrchr (s,':' ); +/* Restore the '(' now. */ +if (open_parenth) + *open_parenth ='(' ; +/* Restore the ';' now. */ if (semicol) *semicol =';' ;
Signature · 6 lines
2.29.2 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/
Miquel Raynal
maintainerHi Sven,
Sven Eckelmann <[email protected]> wrote on Sun, 22 Nov 2020 01:15:33 +0100:
Quoted 9 lines
Some devices (especially QCA ones) are already using hardcoded partition names with colons in it. The OpenMesh A62 for example provides following mtd relevant information via cmdline:
root=31:11 mtdparts=spi0.0:256k(0:SBL1),128k(0:MIBIB),384k(0:QSEE),64k(0:CDT),64k(0:DDRPARAMS),64k(0:APPSBLENV),512k(0:APPSBL),64k(0:ART),64k(custom),64k(0:KEYS),0x002b0000(kernel),0x00c80000(rootfs),15552k(inactive) rootfsname=rootfs rootwait
The change to split only on the last colon between mtd-id and partitions will cause newpart to see following string for the first partition:
Quoted 7 lines
KEYS),0x002b0000(kernel),0x00c80000(rootfs),15552k(inactive)
Such a partition list cannot be parsed and thus the device fails to boot.
Avoid this behavior by making sure that the start of the first part-name ("(") will also be the last byte the mtd-id split algorithm is using for its colon search.
Nice.
Ron, can you give this patch a shot and answer with your Tested-by: to this thread if it still works for you?
Quoted 20 lines
Fixes eb13fa022741 ("mtd: parser: cmdline: Support MTD names containing one or more colons")Signed-off-by Sven Eckelmann <[email protected]>--- drivers/mtd/parsers/cmdlinepart.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)drivers/mtd/parsers/cmdlinepart.c +1
-1@@ -226,7 +226,7 @@ static int mtdpart_setup_real(char *s)struct cmdline_mtd_partition *this_mtd;struct mtd_partition *parts;int mtd_id_len, num_parts; -char *p, *mtd_id, *semicol; +char *p, *mtd_id, *semicol, *open_parenth;/* * Replace the first ';' by a NULL char so strrchr can work
drivers/mtd/parsers/cmdlinepart.c static int mtdpart_setup_real(char *s) · line 240
Quoted 5 lines
drivers/mtd/parsers/cmdlinepart.c +2
-0@@ -236,6 +236,13 @@ static int mtdpart_setup_real(char *s)if (semicol) *semicol ='\0' ; +/* make sure that part-names with ":" will not be handled as +* part of the mtd-id with an ":"
We prefer this style of multiline comment in MTD:
/* * Something. * Something else. */
Quoted 9 lines
drivers/mtd/parsers/cmdlinepart.c +5
-0+*/ + open_parenth =strchr (s,'(' ); +if (open_parenth) + *open_parenth ='\0' ; + mtd_id = s;/*
drivers/mtd/parsers/cmdlinepart.c static int mtdpart_setup_real(char *s) · line 261
Quoted 10 lines
drivers/mtd/parsers/cmdlinepart.c +4
-0@@ -245,6 +252,10 @@ static int mtdpart_setup_real(char *s)*/ p =strrchr (s,':' ); +/* Restore the '(' now. */ +if (open_parenth) + *open_parenth ='(' ; +/* Restore the ';' now. */ if (semicol) *semicol =';' ;
Otherwise LGTM.
Thanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
Quoted 21 lines · On Mon, 23 Nov 2020 09:38:14 +0100 Miquel Raynal <[email protected]>…
Hi Sven,
Sven Eckelmann <[email protected]> wrote on Sun, 22 Nov 2020 01:15:33 +0100:
Quoted 16 lines
Some devices (especially QCA ones) are already using hardcoded partition names with colons in it. The OpenMesh A62 for example provides following mtd relevant information via cmdline:
root=31:11 mtdparts=spi0.0:256k(0:SBL1),128k(0:MIBIB),384k(0:QSEE),64k(0:CDT),64k(0:DDRPARAMS),64k(0:APPSBLENV),512k(0:APPSBL),64k(0:ART),64k(custom),64k(0:KEYS),0x002b0000(kernel),0x00c80000(rootfs),15552k(inactive) rootfsname=rootfs rootwait
The change to split only on the last colon between mtd-id and partitions will cause newpart to see following string for the first partition:
KEYS),0x002b0000(kernel),0x00c80000(rootfs),15552k(inactive)
Such a partition list cannot be parsed and thus the device fails to boot.
Avoid this behavior by making sure that the start of the first part-name ("(") will also be the last byte the mtd-id split algorithm is using for its colon search.
Sounds reasonable to me. Note that it works until people start using parens in their MTD name, so let's hope nobody does that :D. We should really rework the mtdpart parsing code to make it more robust (do context based parsing instead of this simple 'strchr()' solution).
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/