summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Geoffray <ngeoffray@google.com>2023-12-01 09:34:04 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-12-01 16:06:39 +0000
commit75e9a6de119eb769f1fd7201756f105845d73470 (patch)
tree73918ee8c6a811d43a4ba261401788645fe71e37
parentf5d50814f75267990b9f435b8def3a8ac8dab5b0 (diff)
downloadart-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.cc12
-rw-r--r--runtime/image.cc8
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;