diff mbox series

lib: strto: Fix parsing MTD partition size

Message ID 20200424182133.17335-1-pali@kernel.org
State Superseded
Delegated to: Tom Rini
Headers show
Series lib: strto: Fix parsing MTD partition size | expand

Commit Message

Pali Rohár April 24, 2020, 6:21 p.m. UTC
Commit 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16
detection") broke parsing MTD partition sizes specified in decimal base.

E.g. "128k(bootloader)" is parsed by drivers/mtd/mtdpart.c as hexadecimal
number (0x128 << 10) because character 'a' in substring "bootloader" caused
parsing whole number as hexadecimal.

This patch stop doing hexadecimal base heuristic on first non-valid
hexadecimal number, so "128k(bootloader)" is parsed as decimal number 128.

Fixes: 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16...")
Signed-off-by: Pali Rohár <pali@kernel.org>
---
 lib/strto.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Pali Rohár April 24, 2020, 6:29 p.m. UTC | #1
On Friday 24 April 2020 20:21:33 Pali Rohár wrote:
> Commit 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16
> detection") broke parsing MTD partition sizes specified in decimal base.
> 
> E.g. "128k(bootloader)" is parsed by drivers/mtd/mtdpart.c as hexadecimal
> number (0x128 << 10) because character 'a' in substring "bootloader" caused
> parsing whole number as hexadecimal.
> 
> This patch stop doing hexadecimal base heuristic on first non-valid
> hexadecimal number, so "128k(bootloader)" is parsed as decimal number 128.
> 
> Fixes: 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16...")
> Signed-off-by: Pali Rohár <pali@kernel.org>
> ---
>  lib/strto.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/lib/strto.c b/lib/strto.c
> index 1ac2b09c72..060b66b915 100644
> --- a/lib/strto.c
> +++ b/lib/strto.c
> @@ -30,6 +30,9 @@ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
>  
>  			do {
>  				var = tolower(s[i++]);
> +				if (!(var >= '0' && var <= '9') &&
> +				    !(var >= 'a' && var <= 'f'))
> +					break;
>  				if (var >= 'a' && var <= 'f') {
>  					*base = 16;
>  					break;
> -- 
> 2.20.1
> 

CC Tom, this problem was detected by my in-progress Travis Nokia N900
test which tries to boot kernel from the OneNAND. Build log is there:
https://travis-ci.org/github/u-boot/u-boot/jobs/679007310
Tom Rini April 24, 2020, 7:12 p.m. UTC | #2
On Fri, Apr 24, 2020 at 08:29:41PM +0200, Pali Rohár wrote:
> On Friday 24 April 2020 20:21:33 Pali Rohár wrote:
> > Commit 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16
> > detection") broke parsing MTD partition sizes specified in decimal base.
> > 
> > E.g. "128k(bootloader)" is parsed by drivers/mtd/mtdpart.c as hexadecimal
> > number (0x128 << 10) because character 'a' in substring "bootloader" caused
> > parsing whole number as hexadecimal.
> > 
> > This patch stop doing hexadecimal base heuristic on first non-valid
> > hexadecimal number, so "128k(bootloader)" is parsed as decimal number 128.
> > 
> > Fixes: 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16...")
> > Signed-off-by: Pali Rohár <pali@kernel.org>
> > ---
> >  lib/strto.c | 3 +++
> >  1 file changed, 3 insertions(+)
> > 
> > diff --git a/lib/strto.c b/lib/strto.c
> > index 1ac2b09c72..060b66b915 100644
> > --- a/lib/strto.c
> > +++ b/lib/strto.c
> > @@ -30,6 +30,9 @@ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
> >  
> >  			do {
> >  				var = tolower(s[i++]);
> > +				if (!(var >= '0' && var <= '9') &&
> > +				    !(var >= 'a' && var <= 'f'))
> > +					break;
> >  				if (var >= 'a' && var <= 'f') {
> >  					*base = 16;
> >  					break;
> > -- 
> > 2.20.1
> > 
> 
> CC Tom, this problem was detected by my in-progress Travis Nokia N900
> test which tries to boot kernel from the OneNAND. Build log is there:
> https://travis-ci.org/github/u-boot/u-boot/jobs/679007310

This is the same as:
http://patchwork.ozlabs.org/project/uboot/patch/1a681dbefac4c353ad53d7f6cd1a75812036739a.1586333353.git.michal.simek@xilinx.com/
yes?  Thanks!
Pali Rohár April 24, 2020, 7:15 p.m. UTC | #3
On Friday 24 April 2020 15:12:42 Tom Rini wrote:
> On Fri, Apr 24, 2020 at 08:29:41PM +0200, Pali Rohár wrote:
> > On Friday 24 April 2020 20:21:33 Pali Rohár wrote:
> > > Commit 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16
> > > detection") broke parsing MTD partition sizes specified in decimal base.
> > > 
> > > E.g. "128k(bootloader)" is parsed by drivers/mtd/mtdpart.c as hexadecimal
> > > number (0x128 << 10) because character 'a' in substring "bootloader" caused
> > > parsing whole number as hexadecimal.
> > > 
> > > This patch stop doing hexadecimal base heuristic on first non-valid
> > > hexadecimal number, so "128k(bootloader)" is parsed as decimal number 128.
> > > 
> > > Fixes: 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16...")
> > > Signed-off-by: Pali Rohár <pali@kernel.org>
> > > ---
> > >  lib/strto.c | 3 +++
> > >  1 file changed, 3 insertions(+)
> > > 
> > > diff --git a/lib/strto.c b/lib/strto.c
> > > index 1ac2b09c72..060b66b915 100644
> > > --- a/lib/strto.c
> > > +++ b/lib/strto.c
> > > @@ -30,6 +30,9 @@ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
> > >  
> > >  			do {
> > >  				var = tolower(s[i++]);
> > > +				if (!(var >= '0' && var <= '9') &&
> > > +				    !(var >= 'a' && var <= 'f'))
> > > +					break;
> > >  				if (var >= 'a' && var <= 'f') {
> > >  					*base = 16;
> > >  					break;
> > > -- 
> > > 2.20.1
> > > 
> > 
> > CC Tom, this problem was detected by my in-progress Travis Nokia N900
> > test which tries to boot kernel from the OneNAND. Build log is there:
> > https://travis-ci.org/github/u-boot/u-boot/jobs/679007310
> 
> This is the same as:
> http://patchwork.ozlabs.org/project/uboot/patch/1a681dbefac4c353ad53d7f6cd1a75812036739a.1586333353.git.michal.simek@xilinx.com/
> yes?  Thanks!

Yes, this is the same problem.
Tom Rini April 24, 2020, 7:28 p.m. UTC | #4
On Fri, Apr 24, 2020 at 09:15:43PM +0200, Pali Rohár wrote:
> On Friday 24 April 2020 15:12:42 Tom Rini wrote:
> > On Fri, Apr 24, 2020 at 08:29:41PM +0200, Pali Rohár wrote:
> > > On Friday 24 April 2020 20:21:33 Pali Rohár wrote:
> > > > Commit 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16
> > > > detection") broke parsing MTD partition sizes specified in decimal base.
> > > > 
> > > > E.g. "128k(bootloader)" is parsed by drivers/mtd/mtdpart.c as hexadecimal
> > > > number (0x128 << 10) because character 'a' in substring "bootloader" caused
> > > > parsing whole number as hexadecimal.
> > > > 
> > > > This patch stop doing hexadecimal base heuristic on first non-valid
> > > > hexadecimal number, so "128k(bootloader)" is parsed as decimal number 128.
> > > > 
> > > > Fixes: 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16...")
> > > > Signed-off-by: Pali Rohár <pali@kernel.org>
> > > > ---
> > > >  lib/strto.c | 3 +++
> > > >  1 file changed, 3 insertions(+)
> > > > 
> > > > diff --git a/lib/strto.c b/lib/strto.c
> > > > index 1ac2b09c72..060b66b915 100644
> > > > --- a/lib/strto.c
> > > > +++ b/lib/strto.c
> > > > @@ -30,6 +30,9 @@ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
> > > >  
> > > >  			do {
> > > >  				var = tolower(s[i++]);
> > > > +				if (!(var >= '0' && var <= '9') &&
> > > > +				    !(var >= 'a' && var <= 'f'))
> > > > +					break;
> > > >  				if (var >= 'a' && var <= 'f') {
> > > >  					*base = 16;
> > > >  					break;
> > > > -- 
> > > > 2.20.1
> > > > 
> > > 
> > > CC Tom, this problem was detected by my in-progress Travis Nokia N900
> > > test which tries to boot kernel from the OneNAND. Build log is there:
> > > https://travis-ci.org/github/u-boot/u-boot/jobs/679007310
> > 
> > This is the same as:
> > http://patchwork.ozlabs.org/project/uboot/patch/1a681dbefac4c353ad53d7f6cd1a75812036739a.1586333353.git.michal.simek@xilinx.com/
> > yes?  Thanks!
> 
> Yes, this is the same problem.

Can you please test (and Tested-by) that one?  Thanks!
Pali Rohár April 24, 2020, 7:33 p.m. UTC | #5
On Friday 24 April 2020 15:28:01 Tom Rini wrote:
> On Fri, Apr 24, 2020 at 09:15:43PM +0200, Pali Rohár wrote:
> > On Friday 24 April 2020 15:12:42 Tom Rini wrote:
> > > On Fri, Apr 24, 2020 at 08:29:41PM +0200, Pali Rohár wrote:
> > > > On Friday 24 April 2020 20:21:33 Pali Rohár wrote:
> > > > > Commit 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16
> > > > > detection") broke parsing MTD partition sizes specified in decimal base.
> > > > > 
> > > > > E.g. "128k(bootloader)" is parsed by drivers/mtd/mtdpart.c as hexadecimal
> > > > > number (0x128 << 10) because character 'a' in substring "bootloader" caused
> > > > > parsing whole number as hexadecimal.
> > > > > 
> > > > > This patch stop doing hexadecimal base heuristic on first non-valid
> > > > > hexadecimal number, so "128k(bootloader)" is parsed as decimal number 128.
> > > > > 
> > > > > Fixes: 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16...")
> > > > > Signed-off-by: Pali Rohár <pali@kernel.org>
> > > > > ---
> > > > >  lib/strto.c | 3 +++
> > > > >  1 file changed, 3 insertions(+)
> > > > > 
> > > > > diff --git a/lib/strto.c b/lib/strto.c
> > > > > index 1ac2b09c72..060b66b915 100644
> > > > > --- a/lib/strto.c
> > > > > +++ b/lib/strto.c
> > > > > @@ -30,6 +30,9 @@ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
> > > > >  
> > > > >  			do {
> > > > >  				var = tolower(s[i++]);
> > > > > +				if (!(var >= '0' && var <= '9') &&
> > > > > +				    !(var >= 'a' && var <= 'f'))
> > > > > +					break;
> > > > >  				if (var >= 'a' && var <= 'f') {
> > > > >  					*base = 16;
> > > > >  					break;
> > > > > -- 
> > > > > 2.20.1
> > > > > 
> > > > 
> > > > CC Tom, this problem was detected by my in-progress Travis Nokia N900
> > > > test which tries to boot kernel from the OneNAND. Build log is there:
> > > > https://travis-ci.org/github/u-boot/u-boot/jobs/679007310
> > > 
> > > This is the same as:
> > > http://patchwork.ozlabs.org/project/uboot/patch/1a681dbefac4c353ad53d7f6cd1a75812036739a.1586333353.git.michal.simek@xilinx.com/
> > > yes?  Thanks!
> > 
> > Yes, this is the same problem.
> 
> Can you please test (and Tested-by) that one?  Thanks!

It is basically same patch as mine... but ok I'm going to run that my
automated Nokia N900 test locally with above patch.
Pali Rohár April 24, 2020, 7:40 p.m. UTC | #6
On Friday 24 April 2020 21:33:42 Pali Rohár wrote:
> On Friday 24 April 2020 15:28:01 Tom Rini wrote:
> > On Fri, Apr 24, 2020 at 09:15:43PM +0200, Pali Rohár wrote:
> > > On Friday 24 April 2020 15:12:42 Tom Rini wrote:
> > > > On Fri, Apr 24, 2020 at 08:29:41PM +0200, Pali Rohár wrote:
> > > > > On Friday 24 April 2020 20:21:33 Pali Rohár wrote:
> > > > > > Commit 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16
> > > > > > detection") broke parsing MTD partition sizes specified in decimal base.
> > > > > > 
> > > > > > E.g. "128k(bootloader)" is parsed by drivers/mtd/mtdpart.c as hexadecimal
> > > > > > number (0x128 << 10) because character 'a' in substring "bootloader" caused
> > > > > > parsing whole number as hexadecimal.
> > > > > > 
> > > > > > This patch stop doing hexadecimal base heuristic on first non-valid
> > > > > > hexadecimal number, so "128k(bootloader)" is parsed as decimal number 128.
> > > > > > 
> > > > > > Fixes: 0486497e2b5f ("lib: Improve _parse_integer_fixup_radix base 16...")
> > > > > > Signed-off-by: Pali Rohár <pali@kernel.org>
> > > > > > ---
> > > > > >  lib/strto.c | 3 +++
> > > > > >  1 file changed, 3 insertions(+)
> > > > > > 
> > > > > > diff --git a/lib/strto.c b/lib/strto.c
> > > > > > index 1ac2b09c72..060b66b915 100644
> > > > > > --- a/lib/strto.c
> > > > > > +++ b/lib/strto.c
> > > > > > @@ -30,6 +30,9 @@ static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
> > > > > >  
> > > > > >  			do {
> > > > > >  				var = tolower(s[i++]);
> > > > > > +				if (!(var >= '0' && var <= '9') &&
> > > > > > +				    !(var >= 'a' && var <= 'f'))
> > > > > > +					break;
> > > > > >  				if (var >= 'a' && var <= 'f') {
> > > > > >  					*base = 16;
> > > > > >  					break;
> > > > > > -- 
> > > > > > 2.20.1
> > > > > > 
> > > > > 
> > > > > CC Tom, this problem was detected by my in-progress Travis Nokia N900
> > > > > test which tries to boot kernel from the OneNAND. Build log is there:
> > > > > https://travis-ci.org/github/u-boot/u-boot/jobs/679007310
> > > > 
> > > > This is the same as:
> > > > http://patchwork.ozlabs.org/project/uboot/patch/1a681dbefac4c353ad53d7f6cd1a75812036739a.1586333353.git.michal.simek@xilinx.com/
> > > > yes?  Thanks!
> > > 
> > > Yes, this is the same problem.
> > 
> > Can you please test (and Tested-by) that one?  Thanks!
> 
> It is basically same patch as mine... but ok I'm going to run that my
> automated Nokia N900 test locally with above patch.

That patch is working fine, you can add my Tested-by: Pali Rohár <pali@kernel.org> for it
diff mbox series

Patch

diff --git a/lib/strto.c b/lib/strto.c
index 1ac2b09c72..060b66b915 100644
--- a/lib/strto.c
+++ b/lib/strto.c
@@ -30,6 +30,9 @@  static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
 
 			do {
 				var = tolower(s[i++]);
+				if (!(var >= '0' && var <= '9') &&
+				    !(var >= 'a' && var <= 'f'))
+					break;
 				if (var >= 'a' && var <= 'f') {
 					*base = 16;
 					break;