RFR: JDK-8328137: PreserveAllAnnotations can cause failure of class retransformation
Alex Menkov
amenkov at openjdk.org
Thu Mar 28 22:18:38 UTC 2024
PreserveAllAnnotations option causes class file parser to preserve RuntimeInvisibleAnnotations so VM considers them as RuntimeVisibleAnnotations.
For class retransformation JvmtiClassFileReconstituter restores all annotations as RuntimeVisibleAnnotations attributes.
This can cause problem is the class contains only RuntimeInvisibleAnnotations, so corresponding RuntimeVisibleAnnotations attribute name is not present in the class constant pool.
Correct solution would be to store additional information about RuntimeInvisibleAnnotations and restore them exactly as they were in the original class (this should be done for all annotations: RuntimeInvisibleAnnotations/RuntimeInvisibleTypeAnnotations for class, fields and records, RuntimeInvisibleAnnotations/RuntimeInvisibleTypeAnnotations/RuntimeInvisibleParameterAnnotations for methods; need to ensure the information is correctly updated during class redefinition & retransformation).
I think it doesn't make sense to add all the complexity for almost no value (I doubt anyone uses PreserveAllAnnotations, the flag looks like experimental, we don't have any tests for it).
The suggested fix adds workaround for this corner case - if "visible" attribute name is not in the CP, the annotations are restored with "invisible" attribute name.
Testing:
- tier1,tier2,hs-tier5-svc
- all java/lang/instrument tests;
- all RedefineClasses/RetransformClasses tests
-------------
Commit messages:
- fix
Changes: https://git.openjdk.org/jdk/pull/18540/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=18540&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8328137
Stats: 33 lines in 3 files changed: 22 ins; 0 del; 11 mod
Patch: https://git.openjdk.org/jdk/pull/18540.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/18540/head:pull/18540
PR: https://git.openjdk.org/jdk/pull/18540
More information about the serviceability-dev
mailing list