From 3ab05869d84357dd54ee27f971bde6514475bcb6 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 2 Nov 2015 09:01:53 -0800 Subject: [PATCH] Fix ParseInt/ParseUint to handle explicit "0x" hex. Also improve fastboot error reporting around max-download-size. Change-Id: Ic3aec9460de01e5264a2803a0a6be3706d73026b --- base/include/base/parseint.h | 6 ++++-- base/parseint_test.cpp | 10 ++++++++++ fastboot/fastboot.cpp | 2 ++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/base/include/base/parseint.h b/base/include/base/parseint.h index 9ecbfbce9..0543795e1 100644 --- a/base/include/base/parseint.h +++ b/base/include/base/parseint.h @@ -31,9 +31,10 @@ namespace base { template bool ParseUint(const char* s, T* out, T max = std::numeric_limits::max()) { + int base = (s[0] == '0' && s[1] == 'x') ? 16 : 10; errno = 0; char* end; - unsigned long long int result = strtoull(s, &end, 10); + unsigned long long int result = strtoull(s, &end, base); if (errno != 0 || s == end || *end != '\0') { return false; } @@ -52,9 +53,10 @@ template bool ParseInt(const char* s, T* out, T min = std::numeric_limits::min(), T max = std::numeric_limits::max()) { + int base = (s[0] == '0' && s[1] == 'x') ? 16 : 10; errno = 0; char* end; - long long int result = strtoll(s, &end, 10); + long long int result = strtoll(s, &end, base); if (errno != 0 || s == end || *end != '\0') { return false; } diff --git a/base/parseint_test.cpp b/base/parseint_test.cpp index e19c6e3cd..8a11d293f 100644 --- a/base/parseint_test.cpp +++ b/base/parseint_test.cpp @@ -66,3 +66,13 @@ TEST(parseint, no_implicit_octal) { ASSERT_TRUE(android::base::ParseUint("0123", &u)); ASSERT_EQ(123u, u); } + +TEST(parseint, explicit_hex) { + int i; + ASSERT_TRUE(android::base::ParseInt("0x123", &i)); + ASSERT_EQ(0x123, i); + + unsigned int u; + ASSERT_TRUE(android::base::ParseUint("0x123", &u)); + ASSERT_EQ(0x123u, u); +} diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp index 7bf4b3162..6b845a013 100644 --- a/fastboot/fastboot.cpp +++ b/fastboot/fastboot.cpp @@ -571,11 +571,13 @@ static struct sparse_file **load_sparse_files(int fd, int max_size) static int64_t get_target_sparse_limit(usb_handle* usb) { std::string max_download_size; if (!fb_getvar(usb, "max-download-size", &max_download_size)) { + fprintf(stderr, "target didn't report max-download-size\n"); return 0; } uint64_t limit; if (!android::base::ParseUint(max_download_size.c_str(), &limit)) { + fprintf(stderr, "couldn't parse max-download-size '%s'\n", max_download_size.c_str()); return 0; } if (limit > 0) {