Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ab05869 authored by Elliott Hughes's avatar Elliott Hughes
Browse files

Fix ParseInt/ParseUint to handle explicit "0x" hex.

Also improve fastboot error reporting around max-download-size.

Change-Id: Ic3aec9460de01e5264a2803a0a6be3706d73026b
parent 1e2382a0
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -31,9 +31,10 @@ namespace base {
template <typename T>
bool ParseUint(const char* s, T* out,
               T max = std::numeric_limits<T>::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 <typename T>
bool ParseInt(const char* s, T* out,
              T min = std::numeric_limits<T>::min(),
              T max = std::numeric_limits<T>::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;
  }
+10 −0
Original line number Diff line number Diff line
@@ -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);
}
+2 −0
Original line number Diff line number Diff line
@@ -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) {