From cc10008887e2c6d8359af1d08c0bce800e8cb8c0 Mon Sep 17 00:00:00 2001 From: Jin Qian Date: Fri, 17 Nov 2017 23:53:22 -0800 Subject: root: Fix an issue when volume length from fs_mgr is negative. fs_mgr passes negative length as offset for crypt_footer. We need to compute the actual device size for this case in addition to when length is zero. Bug: 68949069 Change-Id: I803955dd9591ad7752cee0dea9b683be8f4fd4ba --- roots.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/roots.cpp b/roots.cpp index c0348d715..47e9a54e3 100644 --- a/roots.cpp +++ b/roots.cpp @@ -262,17 +262,20 @@ int format_volume(const char* volume, const char* directory) { } 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; } } -- cgit v1.2.3