From f9d41c1d269f3031c0a89e34fc4a04303e186958 Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Tue, 10 Jan 2017 08:58:44 +0000 Subject: [PATCH] Revert "Add basic checks for redefinition." Test fails. This reverts commit 10f02fb4f026c493c69b21d4ec7c3096970357e1. Change-Id: I21abfff0d7cd4ec840447f19819b7859b90f45b2 --- runtime/openjdkjvmti/OpenjdkJvmTi.cc | 2 +- runtime/openjdkjvmti/ti_redefine.cc | 116 +---------------------- runtime/openjdkjvmti/ti_redefine.h | 21 +--- test/921-hello-failure/build | 17 ---- test/921-hello-failure/expected.txt | 15 --- test/921-hello-failure/info.txt | 7 -- test/921-hello-failure/run | 20 ---- test/921-hello-failure/src/DifferentAccess.java | 57 ----------- test/921-hello-failure/src/Iface1.java | 19 ---- test/921-hello-failure/src/Iface2.java | 19 ---- test/921-hello-failure/src/Iface3.java | 19 ---- test/921-hello-failure/src/Main.java | 32 ------- test/921-hello-failure/src/MissingInterface.java | 58 ------------ test/921-hello-failure/src/NewInterface.java | 59 ------------ test/921-hello-failure/src/NewName.java | 56 ----------- test/921-hello-failure/src/ReorderInterface.java | 59 ------------ test/921-hello-failure/src/Transform.java | 21 ---- test/921-hello-failure/src/Transform2.java | 21 ---- test/ti-agent/common_helper.cc | 21 +--- test/ti-agent/common_load.cc | 1 - 20 files changed, 7 insertions(+), 633 deletions(-) delete mode 100755 test/921-hello-failure/build delete mode 100644 test/921-hello-failure/expected.txt delete mode 100644 test/921-hello-failure/info.txt delete mode 100755 test/921-hello-failure/run delete mode 100644 test/921-hello-failure/src/DifferentAccess.java delete mode 100644 test/921-hello-failure/src/Iface1.java delete mode 100644 test/921-hello-failure/src/Iface2.java delete mode 100644 test/921-hello-failure/src/Iface3.java delete mode 100644 test/921-hello-failure/src/Main.java delete mode 100644 test/921-hello-failure/src/MissingInterface.java delete mode 100644 test/921-hello-failure/src/NewInterface.java delete mode 100644 test/921-hello-failure/src/NewName.java delete mode 100644 test/921-hello-failure/src/ReorderInterface.java delete mode 100644 test/921-hello-failure/src/Transform.java delete mode 100644 test/921-hello-failure/src/Transform2.java diff --git a/runtime/openjdkjvmti/OpenjdkJvmTi.cc b/runtime/openjdkjvmti/OpenjdkJvmTi.cc index d364d6e0a..9569a91a2 100644 --- a/runtime/openjdkjvmti/OpenjdkJvmTi.cc +++ b/runtime/openjdkjvmti/OpenjdkJvmTi.cc @@ -1190,7 +1190,7 @@ class JvmtiFunctions { reinterpret_cast(dex_file), &error); if (ret != OK) { - LOG(WARNING) << "FAILURE TO REDEFINE " << error; + LOG(ERROR) << "FAILURE TO REDEFINE " << error; } return ret; } diff --git a/runtime/openjdkjvmti/ti_redefine.cc b/runtime/openjdkjvmti/ti_redefine.cc index 6b0e9c848..926819d1d 100644 --- a/runtime/openjdkjvmti/ti_redefine.cc +++ b/runtime/openjdkjvmti/ti_redefine.cc @@ -37,8 +37,6 @@ #include "art_jvmti.h" #include "base/logging.h" -#include "dex_file.h" -#include "dex_file_types.h" #include "events-inl.h" #include "gc/allocation_listener.h" #include "gc/heap.h" @@ -544,118 +542,6 @@ void Redefiner::EnsureObsoleteMethodsAreDeoptimized() { i->ReJitEverything("libOpenJkdJvmti - Class Redefinition"); } -bool Redefiner::CheckClass() { - // TODO Might just want to put it in a ObjPtr and NoSuspend assert. - art::StackHandleScope<1> hs(self_); - // Easy check that only 1 class def is present. - if (dex_file_->NumClassDefs() != 1) { - RecordFailure(ERR(ILLEGAL_ARGUMENT), - StringPrintf("Expected 1 class def in dex file but found %d", - dex_file_->NumClassDefs())); - return false; - } - // Get the ClassDef from the new DexFile. - // Since the dex file has only a single class def the index is always 0. - const art::DexFile::ClassDef& def = dex_file_->GetClassDef(0); - // Get the class as it is now. - art::Handle current_class(hs.NewHandle(GetMirrorClass())); - - // Check the access flags didn't change. - if (def.GetJavaAccessFlags() != (current_class->GetAccessFlags() & art::kAccValidClassFlags)) { - RecordFailure(ERR(UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED), - "Cannot change modifiers of class by redefinition"); - return false; - } - - // Check class name. - // These should have been checked by the dexfile verifier on load. - DCHECK_NE(def.class_idx_, art::dex::TypeIndex::Invalid()) << "Invalid type index"; - const char* descriptor = dex_file_->StringByTypeIdx(def.class_idx_); - DCHECK(descriptor != nullptr) << "Invalid dex file structure!"; - if (!current_class->DescriptorEquals(descriptor)) { - std::string storage; - RecordFailure(ERR(NAMES_DONT_MATCH), - StringPrintf("expected file to contain class called '%s' but found '%s'!", - current_class->GetDescriptor(&storage), - descriptor)); - return false; - } - if (current_class->IsObjectClass()) { - if (def.superclass_idx_ != art::dex::TypeIndex::Invalid()) { - RecordFailure(ERR(UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED), "Superclass added!"); - return false; - } - } else { - const char* super_descriptor = dex_file_->StringByTypeIdx(def.superclass_idx_); - DCHECK(descriptor != nullptr) << "Invalid dex file structure!"; - if (!current_class->GetSuperClass()->DescriptorEquals(super_descriptor)) { - RecordFailure(ERR(UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED), "Superclass changed"); - return false; - } - } - const art::DexFile::TypeList* interfaces = dex_file_->GetInterfacesList(def); - if (interfaces == nullptr) { - if (current_class->NumDirectInterfaces() != 0) { - RecordFailure(ERR(UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED), "Interfaces added"); - return false; - } - } else { - DCHECK(!current_class->IsProxyClass()); - const art::DexFile::TypeList* current_interfaces = current_class->GetInterfaceTypeList(); - if (current_interfaces == nullptr || current_interfaces->Size() != interfaces->Size()) { - RecordFailure(ERR(UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED), "Interfaces added or removed"); - return false; - } - // The order of interfaces is (barely) meaningful so we error if it changes. - const art::DexFile& orig_dex_file = current_class->GetDexFile(); - for (uint32_t i = 0; i < interfaces->Size(); i++) { - if (strcmp( - dex_file_->StringByTypeIdx(interfaces->GetTypeItem(i).type_idx_), - orig_dex_file.StringByTypeIdx(current_interfaces->GetTypeItem(i).type_idx_)) != 0) { - RecordFailure(ERR(UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED), - "Interfaces changed or re-ordered"); - return false; - } - } - } - LOG(WARNING) << "No verification is done on annotations of redefined classes."; - - return true; -} - -// TODO Move this to use IsRedefinable when that function is made. -bool Redefiner::CheckRedefinable() { - art::ObjPtr klass(GetMirrorClass()); - if (klass->IsPrimitive()) { - RecordFailure(ERR(UNMODIFIABLE_CLASS), - "Modification of primitive classes is not supported"); - return false; - } else if (klass->IsInterface()) { - RecordFailure(ERR(UNMODIFIABLE_CLASS), - "Modification of Interface classes is currently not supported"); - return false; - } else if (klass->IsArrayClass()) { - RecordFailure(ERR(UNMODIFIABLE_CLASS), - "Modification of Array classes is not supported"); - return false; - } else if (klass->IsProxyClass()) { - RecordFailure(ERR(UNMODIFIABLE_CLASS), - "Modification of proxy classes is not supported"); - return false; - } - - // TODO We should check if the class has non-obsoletable methods on the stack - LOG(WARNING) << "presence of non-obsoletable methods on stacks is not currently checked"; - return true; -} - -bool Redefiner::CheckRedefinitionIsValid() { - return CheckRedefinable() && - CheckClass() && - CheckSameFields() && - CheckSameMethods(); -} - jvmtiError Redefiner::Run() { art::StackHandleScope<5> hs(self_); // TODO We might want to have a global lock (or one based on the class being redefined at least) @@ -666,7 +552,7 @@ jvmtiError Redefiner::Run() { // doing a try loop. The other allocations we need to ensure that nothing has changed in the time // between allocating them and pausing all threads before we can update them so we need to do a // try loop. - if (!CheckRedefinitionIsValid() || !EnsureClassAllocationsFinished()) { + if (!EnsureRedefinitionIsValid() || !EnsureClassAllocationsFinished()) { return result_; } art::MutableHandle source_class_loader( diff --git a/runtime/openjdkjvmti/ti_redefine.h b/runtime/openjdkjvmti/ti_redefine.h index d6bccb423..9d23ce445 100644 --- a/runtime/openjdkjvmti/ti_redefine.h +++ b/runtime/openjdkjvmti/ti_redefine.h @@ -152,29 +152,14 @@ class Redefiner { void RecordFailure(jvmtiError result, const std::string& error_msg); + // TODO Actually write this. // This will check that no constraints are violated (more than 1 class in dex file, any changes in // number/declaration of methods & fields, changes in access flags, etc.) - bool CheckRedefinitionIsValid() REQUIRES_SHARED(art::Locks::mutator_lock_); - - // Checks that the class can even be redefined. - bool CheckRedefinable() REQUIRES_SHARED(art::Locks::mutator_lock_); - - // Checks that the dex file does not add/remove methods. - bool CheckSameMethods() REQUIRES_SHARED(art::Locks::mutator_lock_) { - LOG(WARNING) << "methods are not checked for modification currently"; - return true; - } - - // Checks that the dex file does not modify fields - bool CheckSameFields() REQUIRES_SHARED(art::Locks::mutator_lock_) { - LOG(WARNING) << "Fields are not checked for modification currently"; + bool EnsureRedefinitionIsValid() { + LOG(WARNING) << "Redefinition is not checked for validity currently"; return true; } - // Checks that the dex file contains only the single expected class and that the top-level class - // data has not been modified in an incompatible manner. - bool CheckClass() REQUIRES_SHARED(art::Locks::mutator_lock_); - bool UpdateJavaDexFile(art::ObjPtr java_dex_file, art::ObjPtr new_cookie, /*out*/art::ObjPtr* original_cookie) diff --git a/test/921-hello-failure/build b/test/921-hello-failure/build deleted file mode 100755 index 898e2e54a..000000000 --- a/test/921-hello-failure/build +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -./default-build "$@" --experimental agents diff --git a/test/921-hello-failure/expected.txt b/test/921-hello-failure/expected.txt deleted file mode 100644 index e2665ef30..000000000 --- a/test/921-hello-failure/expected.txt +++ /dev/null @@ -1,15 +0,0 @@ -hello - NewName -Transformation error : java.lang.Exception(Failed to redefine class due to JVMTI_ERROR_NAMES_DONT_MATCH) -hello - NewName -hello - DifferentAccess -Transformation error : java.lang.Exception(Failed to redefine class due to JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED) -hello - DifferentAccess -hello2 - NewInterface -Transformation error : java.lang.Exception(Failed to redefine class due to JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED) -hello2 - NewInterface -hello2 - MissingInterface -Transformation error : java.lang.Exception(Failed to redefine class due to JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED) -hello2 - MissingInterface -hello2 - ReorderInterface -Transformation error : java.lang.Exception(Failed to redefine class due to JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED) -hello2 - ReorderInterface diff --git a/test/921-hello-failure/info.txt b/test/921-hello-failure/info.txt deleted file mode 100644 index 9d241c77b..000000000 --- a/test/921-hello-failure/info.txt +++ /dev/null @@ -1,7 +0,0 @@ -Tests for redefinition failure modes. - -Tests ----- - -- NewName: The name of the class is changed -- DifferentAccess: Class access is changed from to 'public' diff --git a/test/921-hello-failure/run b/test/921-hello-failure/run deleted file mode 100755 index 3ef4832da..000000000 --- a/test/921-hello-failure/run +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -./default-run "$@" --experimental agents \ - --experimental runtime-plugins \ - --jvmti diff --git a/test/921-hello-failure/src/DifferentAccess.java b/test/921-hello-failure/src/DifferentAccess.java deleted file mode 100644 index d4b16e052..000000000 --- a/test/921-hello-failure/src/DifferentAccess.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.Base64; - -class DifferentAccess { - // The following is a base64 encoding of the following class. - // public class NotTransform { - // public void sayHi(String name) { - // throw new Error("Should not be called!"); - // } - // } - private static final byte[] CLASS_BYTES = Base64.getDecoder().decode( - "yv66vgAAADQAFQoABgAPBwAQCAARCgACABIHABMHABQBAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAP" + - "TGluZU51bWJlclRhYmxlAQAFc2F5SGkBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAApTb3VyY2VG" + - "aWxlAQAOVHJhbnNmb3JtLmphdmEMAAcACAEAD2phdmEvbGFuZy9FcnJvcgEAFVNob3VsZCBub3Qg" + - "YmUgY2FsbGVkIQwABwAMAQAJVHJhbnNmb3JtAQAQamF2YS9sYW5nL09iamVjdAAhAAUABgAAAAAA" + - "AgABAAcACAABAAkAAAAdAAEAAQAAAAUqtwABsQAAAAEACgAAAAYAAQAAAAEAAQALAAwAAQAJAAAA" + - "IgADAAIAAAAKuwACWRIDtwAEvwAAAAEACgAAAAYAAQAAAAMAAQANAAAAAgAO"); - private static final byte[] DEX_BYTES = Base64.getDecoder().decode( - "ZGV4CjAzNQANVRT7zleRLG4E5DhtK7OtoDxZlUQMI5eQAgAAcAAAAHhWNBIAAAAAAAAAAPwBAAAL" + - "AAAAcAAAAAUAAACcAAAAAgAAALAAAAAAAAAAAAAAAAQAAADIAAAAAQAAAOgAAACIAQAACAEAAEoB" + - "AABSAQAAXwEAAHIBAACGAQAAmgEAALEBAADBAQAAxAEAAMgBAADcAQAAAQAAAAIAAAADAAAABAAA" + - "AAcAAAAHAAAABAAAAAAAAAAIAAAABAAAAEQBAAAAAAAAAAAAAAAAAQAKAAAAAQABAAAAAAACAAAA" + - "AAAAAAAAAAABAAAAAgAAAAAAAAAGAAAAAAAAAO4BAAAAAAAAAQABAAEAAADjAQAABAAAAHAQAwAA" + - "AA4ABAACAAIAAADoAQAACQAAACIAAQAbAQUAAABwIAIAEAAnAAAAAQAAAAMABjxpbml0PgALTFRy" + - "YW5zZm9ybTsAEUxqYXZhL2xhbmcvRXJyb3I7ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xh" + - "bmcvU3RyaW5nOwAVU2hvdWxkIG5vdCBiZSBjYWxsZWQhAA5UcmFuc2Zvcm0uamF2YQABVgACVkwA" + - "EmVtaXR0ZXI6IGphY2stNC4yMAAFc2F5SGkAAQAHDgADAQAHDgAAAAEBAIGABIgCAQGgAgwAAAAA" + - "AAAAAQAAAAAAAAABAAAACwAAAHAAAAACAAAABQAAAJwAAAADAAAAAgAAALAAAAAFAAAABAAAAMgA" + - "AAAGAAAAAQAAAOgAAAABIAAAAgAAAAgBAAABEAAAAQAAAEQBAAACIAAACwAAAEoBAAADIAAAAgAA" + - "AOMBAAAAIAAAAQAAAO4BAAAAEAAAAQAAAPwBAAA="); - - public static void doTest(Transform t) { - t.sayHi("DifferentAccess"); - try { - Main.doCommonClassRedefinition(Transform.class, CLASS_BYTES, DEX_BYTES); - } catch (Exception e) { - System.out.println( - "Transformation error : " + e.getClass().getName() + "(" + e.getMessage() + ")"); - } - t.sayHi("DifferentAccess"); - } -} diff --git a/test/921-hello-failure/src/Iface1.java b/test/921-hello-failure/src/Iface1.java deleted file mode 100644 index f53275a65..000000000 --- a/test/921-hello-failure/src/Iface1.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -interface Iface1 { - void sayHi(String s); -} diff --git a/test/921-hello-failure/src/Iface2.java b/test/921-hello-failure/src/Iface2.java deleted file mode 100644 index 54cdd901c..000000000 --- a/test/921-hello-failure/src/Iface2.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -interface Iface2 { - void sayHi(String s); -} diff --git a/test/921-hello-failure/src/Iface3.java b/test/921-hello-failure/src/Iface3.java deleted file mode 100644 index 819134d30..000000000 --- a/test/921-hello-failure/src/Iface3.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -interface Iface3 { - void sayHi(String s); -} diff --git a/test/921-hello-failure/src/Main.java b/test/921-hello-failure/src/Main.java deleted file mode 100644 index 69c48e26c..000000000 --- a/test/921-hello-failure/src/Main.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -public class Main { - - public static void main(String[] args) { - System.loadLibrary(args[1]); - NewName.doTest(new Transform()); - DifferentAccess.doTest(new Transform()); - NewInterface.doTest(new Transform2()); - MissingInterface.doTest(new Transform2()); - ReorderInterface.doTest(new Transform2()); - } - - // Transforms the class. This throws an exception if something goes wrong. - public static native void doCommonClassRedefinition(Class target, - byte[] classfile, - byte[] dexfile) throws Exception; -} diff --git a/test/921-hello-failure/src/MissingInterface.java b/test/921-hello-failure/src/MissingInterface.java deleted file mode 100644 index d17a6defb..000000000 --- a/test/921-hello-failure/src/MissingInterface.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.Base64; - -class MissingInterface { - // The following is a base64 encoding of the following class. - // class Transform2 implements Iface1 { - // public void sayHi(String name) { - // throw new Error("Should not be called!"); - // } - // } - private static final byte[] CLASS_BYTES = Base64.getDecoder().decode( - "yv66vgAAADQAFwoABgAQBwARCAASCgACABMHABQHABUHABYBAAY8aW5pdD4BAAMoKVYBAARDb2Rl" + - "AQAPTGluZU51bWJlclRhYmxlAQAFc2F5SGkBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAApTb3Vy" + - "Y2VGaWxlAQAPVHJhbnNmb3JtMi5qYXZhDAAIAAkBAA9qYXZhL2xhbmcvRXJyb3IBABVTaG91bGQg" + - "bm90IGJlIGNhbGxlZCEMAAgADQEAClRyYW5zZm9ybTIBABBqYXZhL2xhbmcvT2JqZWN0AQAGSWZh" + - "Y2UxACAABQAGAAEABwAAAAIAAAAIAAkAAQAKAAAAHQABAAEAAAAFKrcAAbEAAAABAAsAAAAGAAEA" + - "AAABAAEADAANAAEACgAAACIAAwACAAAACrsAAlkSA7cABL8AAAABAAsAAAAGAAEAAAADAAEADgAA" + - "AAIADw=="); - private static final byte[] DEX_BYTES = Base64.getDecoder().decode( - "ZGV4CjAzNQDiWVay8/Z0/tXQaTTI+QtwTM65gRJVMOusAgAAcAAAAHhWNBIAAAAAAAAAABgCAAAM" + - "AAAAcAAAAAYAAACgAAAAAgAAALgAAAAAAAAAAAAAAAQAAADQAAAAAQAAAPAAAACcAQAAEAEAAFoB" + - "AABiAQAAbAEAAHoBAACNAQAAoQEAALUBAADMAQAA3QEAAOABAADkAQAA+AEAAAEAAAACAAAAAwAA" + - "AAQAAAAFAAAACAAAAAgAAAAFAAAAAAAAAAkAAAAFAAAAVAEAAAEAAAAAAAAAAQABAAsAAAACAAEA" + - "AAAAAAMAAAAAAAAAAQAAAAAAAAADAAAATAEAAAcAAAAAAAAACgIAAAAAAAABAAEAAQAAAP8BAAAE" + - "AAAAcBADAAAADgAEAAIAAgAAAAQCAAAJAAAAIgACABsBBgAAAHAgAgAQACcAAAABAAAAAAAAAAEA" + - "AAAEAAY8aW5pdD4ACExJZmFjZTE7AAxMVHJhbnNmb3JtMjsAEUxqYXZhL2xhbmcvRXJyb3I7ABJM" + - "amF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwAVU2hvdWxkIG5vdCBiZSBjYWxs" + - "ZWQhAA9UcmFuc2Zvcm0yLmphdmEAAVYAAlZMABJlbWl0dGVyOiBqYWNrLTQuMjAABXNheUhpAAEA" + - "Bw4AAwEABw4AAAABAQCAgASQAgEBqAIMAAAAAAAAAAEAAAAAAAAAAQAAAAwAAABwAAAAAgAAAAYA" + - "AACgAAAAAwAAAAIAAAC4AAAABQAAAAQAAADQAAAABgAAAAEAAADwAAAAASAAAAIAAAAQAQAAARAA" + - "AAIAAABMAQAAAiAAAAwAAABaAQAAAyAAAAIAAAD/AQAAACAAAAEAAAAKAgAAABAAAAEAAAAYAgAA"); - - public static void doTest(Transform2 t) { - t.sayHi("MissingInterface"); - try { - Main.doCommonClassRedefinition(Transform2.class, CLASS_BYTES, DEX_BYTES); - } catch (Exception e) { - System.out.println( - "Transformation error : " + e.getClass().getName() + "(" + e.getMessage() + ")"); - } - t.sayHi("MissingInterface"); - } -} diff --git a/test/921-hello-failure/src/NewInterface.java b/test/921-hello-failure/src/NewInterface.java deleted file mode 100644 index fe7722261..000000000 --- a/test/921-hello-failure/src/NewInterface.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.Base64; - -class NewInterface { - // The following is a base64 encoding of the following class. - // class Transform2 implements Iface1, Iface2, Iface3 { - // public void sayHi(String name) { - // throw new Error("Should not be called!"); - // } - // } - private static final byte[] CLASS_BYTES = Base64.getDecoder().decode( - "yv66vgAAADQAGwoABgASBwATCAAUCgACABUHABYHABcHABgHABkHABoBAAY8aW5pdD4BAAMoKVYB" + - "AARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAFc2F5SGkBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYB" + - "AApTb3VyY2VGaWxlAQAPVHJhbnNmb3JtMi5qYXZhDAAKAAsBAA9qYXZhL2xhbmcvRXJyb3IBABVT" + - "aG91bGQgbm90IGJlIGNhbGxlZCEMAAoADwEAClRyYW5zZm9ybTIBABBqYXZhL2xhbmcvT2JqZWN0" + - "AQAGSWZhY2UxAQAGSWZhY2UyAQAGSWZhY2UzACAABQAGAAMABwAIAAkAAAACAAAACgALAAEADAAA" + - "AB0AAQABAAAABSq3AAGxAAAAAQANAAAABgABAAAAAQABAA4ADwABAAwAAAAiAAMAAgAAAAq7AAJZ" + - "EgO3AAS/AAAAAQANAAAABgABAAAAAwABABAAAAACABE="); - private static final byte[] DEX_BYTES = Base64.getDecoder().decode( - "ZGV4CjAzNQCBWnko4SMXeuXSO3fGJBp0WSlc0HLRr63UAgAAcAAAAHhWNBIAAAAAAAAAAEACAAAO" + - "AAAAcAAAAAgAAACoAAAAAgAAAMgAAAAAAAAAAAAAAAQAAADgAAAAAQAAAAABAAC0AQAAIAEAAG4B" + - "AAB2AQAAgAEAAIoBAACUAQAAogEAALUBAADJAQAA3QEAAPQBAAAFAgAACAIAAAwCAAAgAgAAAQAA" + - "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAoAAAAKAAAABwAAAAAAAAALAAAABwAAAGgBAAADAAAA" + - "AAAAAAMAAQANAAAABAABAAAAAAAFAAAAAAAAAAMAAAAAAAAABQAAAFwBAAAJAAAAAAAAADICAAAA" + - "AAAAAQABAAEAAAAnAgAABAAAAHAQAwAAAA4ABAACAAIAAAAsAgAACQAAACIABAAbAQgAAABwIAIA" + - "EAAnAAAAAwAAAAAAAQACAAAAAQAAAAYABjxpbml0PgAITElmYWNlMTsACExJZmFjZTI7AAhMSWZh" + - "Y2UzOwAMTFRyYW5zZm9ybTI7ABFMamF2YS9sYW5nL0Vycm9yOwASTGphdmEvbGFuZy9PYmplY3Q7" + - "ABJMamF2YS9sYW5nL1N0cmluZzsAFVNob3VsZCBub3QgYmUgY2FsbGVkIQAPVHJhbnNmb3JtMi5q" + - "YXZhAAFWAAJWTAASZW1pdHRlcjogamFjay00LjIwAAVzYXlIaQABAAcOAAMBAAcOAAAAAQEAgIAE" + - "oAIBAbgCDAAAAAAAAAABAAAAAAAAAAEAAAAOAAAAcAAAAAIAAAAIAAAAqAAAAAMAAAACAAAAyAAA" + - "AAUAAAAEAAAA4AAAAAYAAAABAAAAAAEAAAEgAAACAAAAIAEAAAEQAAACAAAAXAEAAAIgAAAOAAAA" + - "bgEAAAMgAAACAAAAJwIAAAAgAAABAAAAMgIAAAAQAAABAAAAQAIAAA=="); - - public static void doTest(Transform2 t) { - t.sayHi("NewInterface"); - try { - Main.doCommonClassRedefinition(Transform2.class, CLASS_BYTES, DEX_BYTES); - } catch (Exception e) { - System.out.println( - "Transformation error : " + e.getClass().getName() + "(" + e.getMessage() + ")"); - } - t.sayHi("NewInterface"); - } -} diff --git a/test/921-hello-failure/src/NewName.java b/test/921-hello-failure/src/NewName.java deleted file mode 100644 index a6f249a2e..000000000 --- a/test/921-hello-failure/src/NewName.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.Base64; - -class NewName { - // class NotTransform { - // public void sayHi(String name) { - // throw new Error("Should not be called!"); - // } - // } - private static final byte[] CLASS_BYTES = Base64.getDecoder().decode( - "yv66vgAAADQAFQoABgAPBwAQCAARCgACABIHABMHABQBAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAP" + - "TGluZU51bWJlclRhYmxlAQAFc2F5SGkBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAApTb3VyY2VG" + - "aWxlAQARTm90VHJhbnNmb3JtLmphdmEMAAcACAEAD2phdmEvbGFuZy9FcnJvcgEAFVNob3VsZCBu" + - "b3QgYmUgY2FsbGVkIQwABwAMAQAMTm90VHJhbnNmb3JtAQAQamF2YS9sYW5nL09iamVjdAAgAAUA" + - "BgAAAAAAAgAAAAcACAABAAkAAAAdAAEAAQAAAAUqtwABsQAAAAEACgAAAAYAAQAAAAEAAQALAAwA" + - "AQAJAAAAIgADAAIAAAAKuwACWRIDtwAEvwAAAAEACgAAAAYAAQAAAAMAAQANAAAAAgAO"); - private static final byte[] DEX_BYTES = Base64.getDecoder().decode( - "ZGV4CjAzNQDLV95i5xnv6iUi6uIeDoY5jP5Xe9NP1AiYAgAAcAAAAHhWNBIAAAAAAAAAAAQCAAAL" + - "AAAAcAAAAAUAAACcAAAAAgAAALAAAAAAAAAAAAAAAAQAAADIAAAAAQAAAOgAAACQAQAACAEAAEoB" + - "AABSAQAAYgEAAHUBAACJAQAAnQEAALABAADHAQAAygEAAM4BAADiAQAAAQAAAAIAAAADAAAABAAA" + - "AAcAAAAHAAAABAAAAAAAAAAIAAAABAAAAEQBAAAAAAAAAAAAAAAAAQAKAAAAAQABAAAAAAACAAAA" + - "AAAAAAAAAAAAAAAAAgAAAAAAAAAFAAAAAAAAAPQBAAAAAAAAAQABAAEAAADpAQAABAAAAHAQAwAA" + - "AA4ABAACAAIAAADuAQAACQAAACIAAQAbAQYAAABwIAIAEAAnAAAAAQAAAAMABjxpbml0PgAOTE5v" + - "dFRyYW5zZm9ybTsAEUxqYXZhL2xhbmcvRXJyb3I7ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZh" + - "L2xhbmcvU3RyaW5nOwARTm90VHJhbnNmb3JtLmphdmEAFVNob3VsZCBub3QgYmUgY2FsbGVkIQAB" + - "VgACVkwAEmVtaXR0ZXI6IGphY2stNC4yMAAFc2F5SGkAAQAHDgADAQAHDgAAAAEBAICABIgCAQGg" + - "AgAADAAAAAAAAAABAAAAAAAAAAEAAAALAAAAcAAAAAIAAAAFAAAAnAAAAAMAAAACAAAAsAAAAAUA" + - "AAAEAAAAyAAAAAYAAAABAAAA6AAAAAEgAAACAAAACAEAAAEQAAABAAAARAEAAAIgAAALAAAASgEA" + - "AAMgAAACAAAA6QEAAAAgAAABAAAA9AEAAAAQAAABAAAABAIAAA=="); - - public static void doTest(Transform t) { - t.sayHi("NewName"); - try { - Main.doCommonClassRedefinition(Transform.class, CLASS_BYTES, DEX_BYTES); - } catch (Exception e) { - System.out.println( - "Transformation error : " + e.getClass().getName() + "(" + e.getMessage() + ")"); - } - t.sayHi("NewName"); - } -} diff --git a/test/921-hello-failure/src/ReorderInterface.java b/test/921-hello-failure/src/ReorderInterface.java deleted file mode 100644 index ce78dbc24..000000000 --- a/test/921-hello-failure/src/ReorderInterface.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.util.Base64; - -class ReorderInterface { - // The following is a base64 encoding of the following class. - // class Transform2 implements Iface2, Iface1 { - // public void sayHi(String name) { - // throw new Error("Should not be called!"); - // } - // } - private static final byte[] CLASS_BYTES = Base64.getDecoder().decode( - "yv66vgAAADQAGQoABgARBwASCAATCgACABQHABUHABYHABcHABgBAAY8aW5pdD4BAAMoKVYBAARD" + - "b2RlAQAPTGluZU51bWJlclRhYmxlAQAFc2F5SGkBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAApT" + - "b3VyY2VGaWxlAQAPVHJhbnNmb3JtMi5qYXZhDAAJAAoBAA9qYXZhL2xhbmcvRXJyb3IBABVTaG91" + - "bGQgbm90IGJlIGNhbGxlZCEMAAkADgEAClRyYW5zZm9ybTIBABBqYXZhL2xhbmcvT2JqZWN0AQAG" + - "SWZhY2UyAQAGSWZhY2UxACAABQAGAAIABwAIAAAAAgAAAAkACgABAAsAAAAdAAEAAQAAAAUqtwAB" + - "sQAAAAEADAAAAAYAAQAAAAEAAQANAA4AAQALAAAAIgADAAIAAAAKuwACWRIDtwAEvwAAAAEADAAA" + - "AAYAAQAAAAMAAQAPAAAAAgAQ"); - private static final byte[] DEX_BYTES = Base64.getDecoder().decode( - "ZGV4CjAzNQChWfUC02YEHJZLC4V4pHrGMdqwD8NnzXvAAgAAcAAAAHhWNBIAAAAAAAAAACwCAAAN" + - "AAAAcAAAAAcAAACkAAAAAgAAAMAAAAAAAAAAAAAAAAQAAADYAAAAAQAAAPgAAACoAQAAGAEAAGIB" + - "AABqAQAAdAEAAH4BAACMAQAAnwEAALMBAADHAQAA3gEAAO8BAADyAQAA9gEAAAoCAAABAAAAAgAA" + - "AAMAAAAEAAAABQAAAAYAAAAJAAAACQAAAAYAAAAAAAAACgAAAAYAAABcAQAAAgAAAAAAAAACAAEA" + - "DAAAAAMAAQAAAAAABAAAAAAAAAACAAAAAAAAAAQAAABUAQAACAAAAAAAAAAcAgAAAAAAAAEAAQAB" + - "AAAAEQIAAAQAAABwEAMAAAAOAAQAAgACAAAAFgIAAAkAAAAiAAMAGwEHAAAAcCACABAAJwAAAAIA" + - "AAABAAAAAQAAAAUABjxpbml0PgAITElmYWNlMTsACExJZmFjZTI7AAxMVHJhbnNmb3JtMjsAEUxq" + - "YXZhL2xhbmcvRXJyb3I7ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwAV" + - "U2hvdWxkIG5vdCBiZSBjYWxsZWQhAA9UcmFuc2Zvcm0yLmphdmEAAVYAAlZMABJlbWl0dGVyOiBq" + - "YWNrLTQuMjAABXNheUhpAAEABw4AAwEABw4AAAABAQCAgASYAgEBsAIAAAwAAAAAAAAAAQAAAAAA" + - "AAABAAAADQAAAHAAAAACAAAABwAAAKQAAAADAAAAAgAAAMAAAAAFAAAABAAAANgAAAAGAAAAAQAA" + - "APgAAAABIAAAAgAAABgBAAABEAAAAgAAAFQBAAACIAAADQAAAGIBAAADIAAAAgAAABECAAAAIAAA" + - "AQAAABwCAAAAEAAAAQAAACwCAAA="); - - public static void doTest(Transform2 t) { - t.sayHi("ReorderInterface"); - try { - Main.doCommonClassRedefinition(Transform2.class, CLASS_BYTES, DEX_BYTES); - } catch (Exception e) { - System.out.println( - "Transformation error : " + e.getClass().getName() + "(" + e.getMessage() + ")"); - } - t.sayHi("ReorderInterface"); - } -} diff --git a/test/921-hello-failure/src/Transform.java b/test/921-hello-failure/src/Transform.java deleted file mode 100644 index ee444f060..000000000 --- a/test/921-hello-failure/src/Transform.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -class Transform { - public void sayHi(String name) { - System.out.println("hello - " + name); - } -} diff --git a/test/921-hello-failure/src/Transform2.java b/test/921-hello-failure/src/Transform2.java deleted file mode 100644 index 9d949f323..000000000 --- a/test/921-hello-failure/src/Transform2.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -class Transform2 implements Iface1, Iface2 { - public void sayHi(String name) { - System.out.println("hello2 - " + name); - } -} diff --git a/test/ti-agent/common_helper.cc b/test/ti-agent/common_helper.cc index 01b6c989c..ebf1e4621 100644 --- a/test/ti-agent/common_helper.cc +++ b/test/ti-agent/common_helper.cc @@ -17,7 +17,6 @@ #include "ti-agent/common_helper.h" #include -#include #include "art_method.h" #include "jni.h" @@ -42,24 +41,8 @@ void SetAllCapabilities(jvmtiEnv* env) { namespace common_redefine { -static void throwRedefinitionError(jvmtiEnv* jvmti, JNIEnv* env, jclass target, jvmtiError res) { - std::stringstream err; - char* signature = nullptr; - char* generic = nullptr; - jvmti->GetClassSignature(target, &signature, &generic); - char* error = nullptr; - jvmti->GetErrorName(res, &error); - err << "Failed to redefine class <" << signature << "> due to " << error; - std::string message = err.str(); - jvmti->Deallocate(reinterpret_cast(signature)); - jvmti->Deallocate(reinterpret_cast(generic)); - jvmti->Deallocate(reinterpret_cast(error)); - env->ThrowNew(env->FindClass("java/lang/Exception"), message.c_str()); -} - using RedefineDirectFunction = jvmtiError (*)(jvmtiEnv*, jclass, jint, const unsigned char*); -static void DoClassTransformation(jvmtiEnv* jvmti_env, - JNIEnv* env, +static void DoClassTransformation(jvmtiEnv* jvmti_env, JNIEnv* env, jclass target, jbyteArray class_file_bytes, jbyteArray dex_file_bytes) { @@ -80,7 +63,7 @@ static void DoClassTransformation(jvmtiEnv* jvmti_env, res = f(jvmti_env, target, len, redef_bytes); } if (res != JVMTI_ERROR_NONE) { - throwRedefinitionError(jvmti_env, env, target, res); + printf("Redefinition failed!"); } } diff --git a/test/ti-agent/common_load.cc b/test/ti-agent/common_load.cc index d7579ca02..2f4af9f42 100644 --- a/test/ti-agent/common_load.cc +++ b/test/ti-agent/common_load.cc @@ -75,7 +75,6 @@ AgentLib agents[] = { { "918-fields", Test918Fields::OnLoad, nullptr }, { "919-obsolete-fields", common_redefine::OnLoad, nullptr }, { "920-objects", Test920Objects::OnLoad, nullptr }, - { "921-hello-failure", common_redefine::OnLoad, nullptr }, }; static AgentLib* FindAgent(char* name) { -- 2.11.0