Skip to content

Commit 7af5f28

Browse files
authored
Limit which classes are retransformed (#118786) (#119120)
During entitlements initialization the transformer is added to instrumenation after some classes are already loaded. Currently we end up force loading (though not initializing) all classes that want to transform. This commit simplifies the retransform to only apply to classes which we know are already loaded by the jdk, which Instrumentation provides.
1 parent 4fb5514 commit 7af5f28

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

libs/entitlement/src/main/java/org/elasticsearch/entitlement/initialization/EntitlementInitialization.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.nio.file.Files;
3535
import java.nio.file.Path;
3636
import java.nio.file.StandardOpenOption;
37+
import java.util.ArrayList;
3738
import java.util.Collection;
3839
import java.util.HashMap;
3940
import java.util.List;
@@ -72,17 +73,17 @@ public static void initialize(Instrumentation inst) throws Exception {
7273

7374
Instrumenter instrumenter = INSTRUMENTER_FACTORY.newInstrumenter(EntitlementChecker.class, checkMethods);
7475
inst.addTransformer(new Transformer(instrumenter, classesToTransform), true);
75-
// TODO: should we limit this array somehow?
76-
var classesToRetransform = classesToTransform.stream().map(EntitlementInitialization::internalNameToClass).toArray(Class[]::new);
77-
inst.retransformClasses(classesToRetransform);
76+
inst.retransformClasses(findClassesToRetransform(inst.getAllLoadedClasses(), classesToTransform));
7877
}
7978

80-
private static Class<?> internalNameToClass(String internalName) {
81-
try {
82-
return Class.forName(internalName.replace('/', '.'), false, ClassLoader.getPlatformClassLoader());
83-
} catch (ClassNotFoundException e) {
84-
throw new RuntimeException(e);
79+
private static Class<?>[] findClassesToRetransform(Class<?>[] loadedClasses, Set<String> classesToTransform) {
80+
List<Class<?>> retransform = new ArrayList<>();
81+
for (Class<?> loadedClass : loadedClasses) {
82+
if (classesToTransform.contains(loadedClass.getName().replace(".", "/"))) {
83+
retransform.add(loadedClass);
84+
}
8585
}
86+
return retransform.toArray(new Class<?>[0]);
8687
}
8788

8889
private static PolicyManager createPolicyManager() throws IOException {

0 commit comments

Comments
 (0)