summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/gc/space/image_space.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/runtime/gc/space/image_space.cc b/runtime/gc/space/image_space.cc
index 071997f6b5..261d3c2d8b 100644
--- a/runtime/gc/space/image_space.cc
+++ b/runtime/gc/space/image_space.cc
@@ -646,6 +646,20 @@ ImageSpace* ImageSpace::Init(const char* image_filename, const char* image_locat
return nullptr;
}
+ // Check that the file is large enough.
+ uint64_t image_file_size = static_cast<uint64_t>(file->GetLength());
+ if (image_header.GetImageSize() > image_file_size) {
+ *error_msg = StringPrintf("Image file too small for image heap: %" PRIu64 " vs. %zu.",
+ image_file_size, image_header.GetImageSize());
+ return nullptr;
+ }
+ if (image_header.GetBitmapOffset() + image_header.GetImageBitmapSize() != image_file_size) {
+ *error_msg = StringPrintf("Image file too small for image bitmap: %" PRIu64 " vs. %zu.",
+ image_file_size,
+ image_header.GetBitmapOffset() + image_header.GetImageBitmapSize());
+ return nullptr;
+ }
+
// Note: The image header is part of the image due to mmap page alignment required of offset.
std::unique_ptr<MemMap> map(MemMap::MapFileAtAddress(image_header.GetImageBegin(),
image_header.GetImageSize(),