Skip to content

Commit 6662850

Browse files
committed
Added pre-cautionary catch of linkage errors
1 parent 492c968 commit 6662850

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoader.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -327,12 +327,23 @@ private BytecodeWithUrl getInjectedClass(String name) {
327327
}
328328

329329
private Class<?> defineClassWithPackage(String name, byte[] bytecode) {
330-
int lastDotIndex = name.lastIndexOf('.');
331-
if (lastDotIndex != -1) {
332-
String packageName = name.substring(0, lastDotIndex);
333-
safeDefinePackage(packageName);
330+
try {
331+
int lastDotIndex = name.lastIndexOf('.');
332+
if (lastDotIndex != -1) {
333+
String packageName = name.substring(0, lastDotIndex);
334+
safeDefinePackage(packageName);
335+
}
336+
return defineClass(name, bytecode, 0, bytecode.length, PROTECTION_DOMAIN);
337+
} catch (LinkageError error) {
338+
// Pre-caution against linkage error due to nested instrumentations happening
339+
// it might be possible that e.g. an advice class has already been defined
340+
// during an instrumentation of defineClass
341+
Class<?> clazz = findLoadedClass(name);
342+
if (clazz != null) {
343+
return clazz;
344+
}
345+
throw error;
334346
}
335-
return defineClass(name, bytecode, 0, bytecode.length, PROTECTION_DOMAIN);
336347
}
337348

338349
private void safeDefinePackage(String packageName) {

0 commit comments

Comments
 (0)