Skip to content

Commit 978d6d6

Browse files
committed
read bootstrap prefixes before incrementing call depth
1 parent aaaf6e4 commit 978d6d6

File tree

3 files changed

+9
-4
lines changed

3 files changed

+9
-4
lines changed

instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.opentelemetry.javaagent.bootstrap.CallDepth;
2222
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2323
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
24+
import java.util.List;
2425
import net.bytebuddy.asm.Advice;
2526
import net.bytebuddy.asm.Advice.AssignReturned;
2627
import net.bytebuddy.description.method.MethodDescription;
@@ -69,7 +70,11 @@ public void transform(TypeTransformer transformer) {
6970
public static class LoadClassAdvice {
7071

7172
@Advice.OnMethodEnter(skipOn = Advice.OnNonDefaultValue.class)
72-
public static Class<?> onEnter(@Advice.Argument(0) String name) {
73+
public static Class<?> onEnter(@Advice.This ClassLoader classLoader, @Advice.Argument(0) String name) {
74+
// must be read before call depth is incremented as setting the call depth prevents the class
75+
// loader of the instrumented class from loading BootstrapPackagePrefixesHolder itself
76+
List<String> bootstrapPackagePrefixes = BootstrapPackagePrefixesHolder.getBootstrapPackagePrefixes();
77+
7378
// need to use call depth here to prevent re-entry from call to Class.forName() below
7479
// because on some JVMs (e.g. IBM's, though IBM bootstrap loader is explicitly excluded above)
7580
// Class.forName() ends up calling loadClass() on the bootstrap loader which would then come
@@ -81,7 +86,7 @@ public static Class<?> onEnter(@Advice.Argument(0) String name) {
8186
}
8287

8388
try {
84-
for (String prefix : BootstrapPackagePrefixesHolder.getBoostrapPackagePrefixes()) {
89+
for (String prefix : bootstrapPackagePrefixes) {
8590
if (name.startsWith(prefix)) {
8691
try {
8792
return Class.forName(name, false, null);

javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/BootstrapPackagePrefixesHolder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public final class BootstrapPackagePrefixesHolder {
2020

2121
private static volatile List<String> bootstrapPackagePrefixes;
2222

23-
public static List<String> getBoostrapPackagePrefixes() {
23+
public static List<String> getBootstrapPackagePrefixes() {
2424
return bootstrapPackagePrefixes;
2525
}
2626

testing-common/integration-tests/src/test/java/instrumentation/AgentInstrumentationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class AgentInstrumentationTest {
3939

4040
private static final ClassLoader BOOTSTRAP_CLASSLOADER = null;
4141
private static final List<String> BOOTSTRAP_PACKAGE_PREFIXES =
42-
BootstrapPackagePrefixesHolder.getBoostrapPackagePrefixes();
42+
BootstrapPackagePrefixesHolder.getBootstrapPackagePrefixes();
4343

4444
@RegisterExtension
4545
static final InstrumentationExtension testing = AgentInstrumentationExtension.create();

0 commit comments

Comments
 (0)