The current strtoll() implementation in hvmloader requires hex number to be
prefixed with 0x, otherwise strtoll() won't parse them correctly even when
calling the function with base == 16.
Fix this by not unconditionally setting the base to 10 when the string is
not 0 prefixed, this also allows parsing octal numbers not 0 prefixed.
While there also handle '0X' as a valid hex number prefix, together with
'0x'.
No functional change intended to the existing call sites.
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
---
Noticed this oddity while looking at something else - I don't really have a
use case for such parsing, but I think it would be better to get this fixed
in case it's needed in the future.
---
tools/firmware/hvmloader/util.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c
index 31b4411db7b4..e65134268189 100644
--- a/tools/firmware/hvmloader/util.c
+++ b/tools/firmware/hvmloader/util.c
@@ -206,20 +206,18 @@ strtoll(const char *s, char **end, int base)
if ( *s == '\0' ) goto out;
- if ( *s == '0' ) {
+ if ( (base == 0 || base == 16) && *s == '0' ) {
s++;
if ( *s == '\0' ) goto out;
- if ( *s == 'x' ) {
- if ( base != 0 && base != 16) goto out;
+ if ( *s == 'x' || *s == 'X' ) {
base = 16;
s++;
} else {
- if ( base != 0 && base != 8) goto out;
+ if ( base != 0 ) goto out;
base = 8;
}
- } else {
- if (base != 0 && base != 10) goto out;
+ } else if ( base == 0 ) {
base = 10;
}
--
2.49.0