diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2023-12-01 09:34:04 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-12-01 16:06:39 +0000 |
commit | 75e9a6de119eb769f1fd7201756f105845d73470 (patch) | |
tree | 73918ee8c6a811d43a4ba261401788645fe71e37 | |
parent | f5d50814f75267990b9f435b8def3a8ac8dab5b0 (diff) | |
download | art-75e9a6de119eb769f1fd7201756f105845d73470.tar.gz |
Handle a failed decompression when loading an image.
Return that the image is invalid.
Test: test.py
Bug: 313386549
(cherry picked from https://android-review.googlesource.com/q/commit:2127227f404665ceb19744e4f6ff622974d590ac)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:e5c1ac8b6aea9ebc606d80853662e32963e5f88a)
Merged-In: I2f0e3847fc704270dd94212811b50d4cb2852cf5
Change-Id: I2f0e3847fc704270dd94212811b50d4cb2852cf5
-rw-r--r-- | runtime/gc/space/image_space.cc | 12 | ||||
-rw-r--r-- | runtime/image.cc | 8 |
2 files changed, 15 insertions, 5 deletions
diff --git a/runtime/gc/space/image_space.cc b/runtime/gc/space/image_space.cc index 56efcabb7c..f4606018b2 100644 --- a/runtime/gc/space/image_space.cc +++ b/runtime/gc/space/image_space.cc @@ -1052,6 +1052,7 @@ class ImageSpace::Loader { Thread* const self = Thread::Current(); static constexpr size_t kMinBlocks = 2u; const bool use_parallel = pool != nullptr && image_header.GetBlockCount() >= kMinBlocks; + bool failed_decompression = false; for (const ImageHeader::Block& block : image_header.GetBlocks(temp_map.Begin())) { auto function = [&](Thread*) { const uint64_t start2 = NanoTime(); @@ -1059,8 +1060,11 @@ class ImageSpace::Loader { bool result = block.Decompress(/*out_ptr=*/map.Begin(), /*in_ptr=*/temp_map.Begin(), error_msg); - if (!result && error_msg != nullptr) { - *error_msg = "Failed to decompress image block " + *error_msg; + if (!result) { + failed_decompression = true; + if (error_msg != nullptr) { + *error_msg = "Failed to decompress image block " + *error_msg; + } } VLOG(image) << "Decompress block " << block.GetDataSize() << " -> " << block.GetImageSize() << " in " << PrettyDuration(NanoTime() - start2); @@ -1082,6 +1086,10 @@ class ImageSpace::Loader { VLOG(image) << "Decompressing image took " << PrettyDuration(time) << " (" << PrettySize(static_cast<uint64_t>(map.Size()) * MsToNs(1000) / (time + 1)) << "/s)"; + if (failed_decompression) { + DCHECK(error_msg == nullptr || !error_msg->empty()); + return MemMap::Invalid(); + } } else { DCHECK(!allow_direct_mapping); // We do not allow direct mapping for boot image extensions compiled to a memfd. diff --git a/runtime/image.cc b/runtime/image.cc index 8596acdd1d..37437b4b86 100644 --- a/runtime/image.cc +++ b/runtime/image.cc @@ -220,9 +220,11 @@ bool ImageHeader::Block::Decompress(uint8_t* out_ptr, return false; } if (decompressed_size != image_size_) { - // Maybe some disk / memory corruption, just bail. - *error_msg = (std::ostringstream() << "Decompressed size different than image size: " - << decompressed_size << ", and " << image_size_).str(); + if (error_msg != nullptr) { + // Maybe some disk / memory corruption, just bail. + *error_msg = (std::ostringstream() << "Decompressed size different than image size: " + << decompressed_size << ", and " << image_size_).str(); + } return false; } break; |