ART: Check image size when opening

The image file might have been truncated. In that case, reject
loading the image space.

Bug: 19398702
Change-Id: I8e46340fe1e05629704d6e3bae84caf8b0435125
diff --git a/runtime/gc/space/image_space.cc b/runtime/gc/space/image_space.cc
index 071997f..261d3c2 100644
--- a/runtime/gc/space/image_space.cc
+++ b/runtime/gc/space/image_space.cc
@@ -646,6 +646,20 @@
     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(),