From 49de5a21881be28f01a639fa4e773eb6beb6f8d3 Mon Sep 17 00:00:00 2001 From: Jeff Hao Date: Mon, 23 May 2016 19:17:04 -0700 Subject: Don't update checksum if data ptr is null. Passing a nullptr to adler32 resets it to its initial value. Bug: 28874264 Change-Id: I863fa4d489618c1c6fa579cc89fb050f4cd23760 --- compiler/oat_test.cc | 58 +++++++++++++++++++++++++++++++++++++--------------- runtime/oat.cc | 8 ++++++-- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/compiler/oat_test.cc b/compiler/oat_test.cc index 5b192846ba..21e198c12f 100644 --- a/compiler/oat_test.cc +++ b/compiler/oat_test.cc @@ -448,23 +448,23 @@ TEST_F(OatTest, OatHeaderSizeCheck) { } TEST_F(OatTest, OatHeaderIsValid) { - InstructionSet insn_set = kX86; - std::string error_msg; - std::unique_ptr insn_features( - InstructionSetFeatures::FromVariant(insn_set, "default", &error_msg)); - ASSERT_TRUE(insn_features.get() != nullptr) << error_msg; - std::unique_ptr oat_header(OatHeader::Create(insn_set, - insn_features.get(), - 0u, - nullptr)); - ASSERT_NE(oat_header.get(), nullptr); - ASSERT_TRUE(oat_header->IsValid()); - - char* magic = const_cast(oat_header->GetMagic()); - strcpy(magic, ""); // bad magic - ASSERT_FALSE(oat_header->IsValid()); - strcpy(magic, "oat\n000"); // bad version - ASSERT_FALSE(oat_header->IsValid()); + InstructionSet insn_set = kX86; + std::string error_msg; + std::unique_ptr insn_features( + InstructionSetFeatures::FromVariant(insn_set, "default", &error_msg)); + ASSERT_TRUE(insn_features.get() != nullptr) << error_msg; + std::unique_ptr oat_header(OatHeader::Create(insn_set, + insn_features.get(), + 0u, + nullptr)); + ASSERT_NE(oat_header.get(), nullptr); + ASSERT_TRUE(oat_header->IsValid()); + + char* magic = const_cast(oat_header->GetMagic()); + strcpy(magic, ""); // bad magic + ASSERT_FALSE(oat_header->IsValid()); + strcpy(magic, "oat\n000"); // bad version + ASSERT_FALSE(oat_header->IsValid()); } TEST_F(OatTest, EmptyTextSection) { @@ -766,4 +766,28 @@ TEST_F(OatTest, ZipFileInputCheckVerifier) { TestZipFileInput(true); } +TEST_F(OatTest, UpdateChecksum) { + InstructionSet insn_set = kX86; + std::string error_msg; + std::unique_ptr insn_features( + InstructionSetFeatures::FromVariant(insn_set, "default", &error_msg)); + ASSERT_TRUE(insn_features.get() != nullptr) << error_msg; + std::unique_ptr oat_header(OatHeader::Create(insn_set, + insn_features.get(), + 0u, + nullptr)); + // The starting adler32 value is 1. + EXPECT_EQ(1U, oat_header->GetChecksum()); + + oat_header->UpdateChecksum(OatHeader::kOatMagic, sizeof(OatHeader::kOatMagic)); + EXPECT_EQ(64291151U, oat_header->GetChecksum()); + + // Make sure that null data does not reset the checksum. + oat_header->UpdateChecksum(nullptr, 0); + EXPECT_EQ(64291151U, oat_header->GetChecksum()); + + oat_header->UpdateChecksum(OatHeader::kOatMagic, sizeof(OatHeader::kOatMagic)); + EXPECT_EQ(216138397U, oat_header->GetChecksum()); +} + } // namespace art diff --git a/runtime/oat.cc b/runtime/oat.cc index 80231f3890..aab0e81047 100644 --- a/runtime/oat.cc +++ b/runtime/oat.cc @@ -182,8 +182,12 @@ void OatHeader::UpdateChecksumWithHeaderData() { void OatHeader::UpdateChecksum(const void* data, size_t length) { DCHECK(IsValid()); - const uint8_t* bytes = reinterpret_cast(data); - adler32_checksum_ = adler32(adler32_checksum_, bytes, length); + if (data != nullptr) { + const uint8_t* bytes = reinterpret_cast(data); + adler32_checksum_ = adler32(adler32_checksum_, bytes, length); + } else { + DCHECK_EQ(0U, length); + } } InstructionSet OatHeader::GetInstructionSet() const { -- cgit v1.2.3