diff options
author | Andreas Gampe <agampe@google.com> | 2015-04-25 03:51:07 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-04-25 03:51:07 +0000 |
commit | 1e3ab9ad421d471ca8eadac03084ce19fd06d4eb (patch) | |
tree | 5657ce4afd75cff76c472b23b684a89ef1e141b5 | |
parent | 940c65d6757130d2e9f864d4c2220838f0312bea (diff) | |
parent | dd3208d3b2f4b78678a341f38a5cc7761c7fca91 (diff) | |
download | art-1e3ab9ad421d471ca8eadac03084ce19fd06d4eb.tar.gz art-1e3ab9ad421d471ca8eadac03084ce19fd06d4eb.tar.bz2 art-1e3ab9ad421d471ca8eadac03084ce19fd06d4eb.zip |
Merge "ART: Fix DBG_START_LOCAL verification."
-rw-r--r-- | runtime/dex_file_verifier.cc | 4 | ||||
-rw-r--r-- | runtime/dex_file_verifier_test.cc | 83 |
2 files changed, 79 insertions, 8 deletions
diff --git a/runtime/dex_file_verifier.cc b/runtime/dex_file_verifier.cc index 2603975910..a66c38e0fe 100644 --- a/runtime/dex_file_verifier.cc +++ b/runtime/dex_file_verifier.cc @@ -944,7 +944,7 @@ bool DexFileVerifier::CheckIntraDebugInfoItem() { uint32_t type_idx = DecodeUnsignedLeb128(&ptr_); if (type_idx != 0) { type_idx--; - if (!CheckIndex(type_idx, header_->string_ids_size_, "DBG_START_LOCAL type_idx")) { + if (!CheckIndex(type_idx, header_->type_ids_size_, "DBG_START_LOCAL type_idx")) { return false; } } @@ -975,7 +975,7 @@ bool DexFileVerifier::CheckIntraDebugInfoItem() { uint32_t type_idx = DecodeUnsignedLeb128(&ptr_); if (type_idx != 0) { type_idx--; - if (!CheckIndex(type_idx, header_->string_ids_size_, "DBG_START_LOCAL_EXTENDED type_idx")) { + if (!CheckIndex(type_idx, header_->type_ids_size_, "DBG_START_LOCAL_EXTENDED type_idx")) { return false; } } diff --git a/runtime/dex_file_verifier_test.cc b/runtime/dex_file_verifier_test.cc index 95a47cc6e9..9f1ffec35f 100644 --- a/runtime/dex_file_verifier_test.cc +++ b/runtime/dex_file_verifier_test.cc @@ -200,11 +200,11 @@ static std::unique_ptr<const DexFile> FixChecksumAndOpen(uint8_t* bytes, size_t return dex_file; } -static bool ModifyAndLoad(const char* location, size_t offset, uint8_t new_val, - std::string* error_msg) { +static bool ModifyAndLoad(const char* dex_file_content, const char* location, size_t offset, + uint8_t new_val, std::string* error_msg) { // Decode base64. size_t length; - std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(kGoodTestDex, &length)); + std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(dex_file_content, &length)); CHECK(dex_bytes.get() != nullptr); // Make modifications. @@ -221,7 +221,7 @@ TEST_F(DexFileVerifierTest, MethodId) { // Class error. ScratchFile tmp; std::string error_msg; - bool success = !ModifyAndLoad(tmp.GetFilename().c_str(), 220, 0xFFU, &error_msg); + bool success = !ModifyAndLoad(kGoodTestDex, tmp.GetFilename().c_str(), 220, 0xFFU, &error_msg); ASSERT_TRUE(success); ASSERT_NE(error_msg.find("inter_method_id_item class_idx"), std::string::npos) << error_msg; } @@ -230,7 +230,7 @@ TEST_F(DexFileVerifierTest, MethodId) { // Proto error. ScratchFile tmp; std::string error_msg; - bool success = !ModifyAndLoad(tmp.GetFilename().c_str(), 222, 0xFFU, &error_msg); + bool success = !ModifyAndLoad(kGoodTestDex, tmp.GetFilename().c_str(), 222, 0xFFU, &error_msg); ASSERT_TRUE(success); ASSERT_NE(error_msg.find("inter_method_id_item proto_idx"), std::string::npos) << error_msg; } @@ -239,10 +239,81 @@ TEST_F(DexFileVerifierTest, MethodId) { // Name error. ScratchFile tmp; std::string error_msg; - bool success = !ModifyAndLoad(tmp.GetFilename().c_str(), 224, 0xFFU, &error_msg); + bool success = !ModifyAndLoad(kGoodTestDex, tmp.GetFilename().c_str(), 224, 0xFFU, &error_msg); ASSERT_TRUE(success); ASSERT_NE(error_msg.find("inter_method_id_item name_idx"), std::string::npos) << error_msg; } } +// Generated from: +// +// .class public LTest; +// .super Ljava/lang/Object; +// .source "Test.java" +// +// .method public constructor <init>()V +// .registers 1 +// +// .prologue +// .line 1 +// invoke-direct {p0}, Ljava/lang/Object;-><init>()V +// +// return-void +// .end method +// +// .method public static main()V +// .registers 2 +// +// const-string v0, "a" +// const-string v0, "b" +// const-string v0, "c" +// const-string v0, "d" +// const-string v0, "e" +// const-string v0, "f" +// const-string v0, "g" +// const-string v0, "h" +// const-string v0, "i" +// const-string v0, "j" +// const-string v0, "k" +// +// .local v1, "local_var":Ljava/lang/String; +// const-string v1, "test" +// .end method + +static const char kDebugInfoTestDex[] = + "ZGV4CjAzNQCHRkHix2eIMQgvLD/0VGrlllZLo0Rb6VyUAgAAcAAAAHhWNBIAAAAAAAAAAAwCAAAU" + "AAAAcAAAAAQAAADAAAAAAQAAANAAAAAAAAAAAAAAAAMAAADcAAAAAQAAAPQAAACAAQAAFAEAABQB" + "AAAcAQAAJAEAADgBAABMAQAAVwEAAFoBAABdAQAAYAEAAGMBAABmAQAAaQEAAGwBAABvAQAAcgEA" + "AHUBAAB4AQAAewEAAIYBAACMAQAAAQAAAAIAAAADAAAABQAAAAUAAAADAAAAAAAAAAAAAAAAAAAA" + "AAAAABIAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAEAAAAAAAAAPwBAAAAAAAABjxpbml0PgAG" + "TFRlc3Q7ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwAJVGVzdC5qYXZh" + "AAFWAAFhAAFiAAFjAAFkAAFlAAFmAAFnAAFoAAFpAAFqAAFrAAlsb2NhbF92YXIABG1haW4ABHRl" + "c3QAAAABAAcOAAAAARYDARIDAAAAAQABAAEAAACUAQAABAAAAHAQAgAAAA4AAgAAAAAAAACZAQAA" + "GAAAABoABgAaAAcAGgAIABoACQAaAAoAGgALABoADAAaAA0AGgAOABoADwAaABAAGgETAAAAAgAA" + "gYAEpAMBCbwDAAALAAAAAAAAAAEAAAAAAAAAAQAAABQAAABwAAAAAgAAAAQAAADAAAAAAwAAAAEA" + "AADQAAAABQAAAAMAAADcAAAABgAAAAEAAAD0AAAAAiAAABQAAAAUAQAAAyAAAAIAAACUAQAAASAA" + "AAIAAACkAQAAACAAAAEAAAD8AQAAABAAAAEAAAAMAgAA"; + +TEST_F(DexFileVerifierTest, DebugInfoTypeIdxTest) { + { + // The input dex file should be good before modification. + ScratchFile tmp; + std::string error_msg; + std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kDebugInfoTestDex, + tmp.GetFilename().c_str(), + &error_msg)); + ASSERT_TRUE(raw.get() != nullptr) << error_msg; + } + + { + // Modify the debug information entry. + ScratchFile tmp; + std::string error_msg; + bool success = !ModifyAndLoad(kDebugInfoTestDex, tmp.GetFilename().c_str(), 416, 0x14U, + &error_msg); + ASSERT_TRUE(success); + ASSERT_NE(error_msg.find("DBG_START_LOCAL type_idx"), std::string::npos) << error_msg; + } +} + } // namespace art |