Merge "root: Fix an issue when volume length from fs_mgr is negative." am: 5ce9fe355c am: 25e27f48db
am: 7a1abb9279

Change-Id: I6836e9294639fd99f65541960f33234e30262e2e
diff --git a/roots.cpp b/roots.cpp
index 3cc7b41..eb299ad 100644
--- a/roots.cpp
+++ b/roots.cpp
@@ -262,17 +262,20 @@
   }
 
   int64_t length = 0;
-  if (v->length != 0) {
+  if (v->length > 0) {
     length = v->length;
-  } else if (v->key_loc != nullptr && strcmp(v->key_loc, "footer") == 0) {
+  } else if (v->length < 0 ||
+             (v->key_loc != nullptr && strcmp(v->key_loc, "footer") == 0)) {
     android::base::unique_fd fd(open(v->blk_device, O_RDONLY));
     if (fd == -1) {
       PLOG(ERROR) << "format_volume: failed to open " << v->blk_device;
       return -1;
     }
-    length = get_file_size(fd.get(), CRYPT_FOOTER_OFFSET);
+    length =
+        get_file_size(fd.get(), v->length ? -v->length : CRYPT_FOOTER_OFFSET);
     if (length <= 0) {
-      LOG(ERROR) << "get_file_size: invalid size " << length << " for " << v->blk_device;
+      LOG(ERROR) << "get_file_size: invalid size " << length << " for "
+                 << v->blk_device;
       return -1;
     }
   }