diff options
author | Miquel Raynal <miquel.raynal@bootlin.com> | 2018-09-06 10:08:43 +0300 |
---|---|---|
committer | Jagan Teki <jagan@amarulasolutions.com> | 2018-09-20 17:41:01 +0300 |
commit | a353e6aa8ec8f0aa101cc7e9543fe7843ddc6d98 (patch) | |
tree | bb911ce09452ffdcb55da32756fa237db9e54eea /lib | |
parent | 2b9ace5527d33539844fa831e12ad8357a25246e (diff) | |
download | u-boot-a353e6aa8ec8f0aa101cc7e9543fe7843ddc6d98.tar.xz |
lib: strto: parse all lowercase metric prefixes in ustrtoul[l]
Both ustrtoul and ustrtoull interpret 1k but not 1m or 1g. Even if the
SI symbols for Mega and Giga are 'M' and 'G', certain entries of
eg. mtdparts also use (wrongly) the metric prefix 'm' and 'g'.
I do not see how parsing lowercase prefixes could break anything, so
parse them like their uppercase counterpart.
Also, even though kiB is not equal to kB in general, lets not change
U-Boot behavior and always use kiB and kB (same applies for MiB vs. MB
and GiB vs. GB) as a representation for 1024 instead of 1000.
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Reviewed-by: Stefan Roese <sr@denx.de>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/strto.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/lib/strto.c b/lib/strto.c index 7f6076909a..b7fc31d6e5 100644 --- a/lib/strto.c +++ b/lib/strto.c @@ -85,14 +85,13 @@ long simple_strtol(const char *cp, char **endp, unsigned int base) unsigned long ustrtoul(const char *cp, char **endp, unsigned int base) { unsigned long result = simple_strtoul(cp, endp, base); - switch (**endp) { - case 'G': + switch (tolower(**endp)) { + case 'g': result *= 1024; /* fall through */ - case 'M': + case 'm': result *= 1024; /* fall through */ - case 'K': case 'k': result *= 1024; if ((*endp)[1] == 'i') { @@ -108,14 +107,13 @@ unsigned long ustrtoul(const char *cp, char **endp, unsigned int base) unsigned long long ustrtoull(const char *cp, char **endp, unsigned int base) { unsigned long long result = simple_strtoull(cp, endp, base); - switch (**endp) { - case 'G': + switch (tolower(**endp)) { + case 'g': result *= 1024; /* fall through */ - case 'M': + case 'm': result *= 1024; /* fall through */ - case 'K': case 'k': result *= 1024; if ((*endp)[1] == 'i') { |