From fdca4401fd93e430fd2539caf697a007a092aa07 Mon Sep 17 00:00:00 2001 From: jean-philippe bempel Date: Thu, 5 Dec 2024 11:17:12 +0100 Subject: [PATCH] Fix class file version detection we are forcing 1.8 class file version when it's below, but we are checking against the full version while we need to check against the major version only --- .../debugger/agent/DebuggerTransformer.java | 2 +- .../debugger/agent/CapturedSnapshotTest.java | 19 ++++++++++++++++++ .../classfiles/BooleanUtils.classfile | Bin 0 -> 7137 bytes 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 dd-java-agent/agent-debugger/src/test/resources/classfiles/BooleanUtils.classfile diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java index 50d0f6c1b12..b6875100c65 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java @@ -422,7 +422,7 @@ private byte[] writeClassFile( ClassLoader loader, String classFilePath, ClassNode classNode) { - if (classNode.version < Opcodes.V1_8) { + if ((classNode.version & 0xFF) < Opcodes.V1_8) { // Class file version must be at least 1.8 (52) classNode.version = Opcodes.V1_8; } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java index e8dc10ab2b7..728ab2820a7 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java @@ -66,6 +66,7 @@ import java.lang.reflect.Modifier; import java.net.URISyntaxException; import java.net.URL; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -211,6 +212,24 @@ public void veryOldClassFile() throws Exception { assertOneSnapshot(listener); } + @Test + public void oldClass1_1() throws Exception { + final String CLASS_NAME = "org.apache.commons.lang.BooleanUtils"; // compiled with jdk 1.1 + TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "toBoolean", null); + when(config.isDebuggerVerifyByteCode()).thenReturn(true); + Class testClass = + loadClass( + CLASS_NAME, + Paths.get( + CapturedSnapshotTest.class + .getResource("/classfiles/BooleanUtils.classfile") + .toURI()) + .toString()); + boolean result = Reflect.onClass(testClass).call("toBoolean", Boolean.TRUE).get(); + assertTrue(result); + assertOneSnapshot(listener); + } + @Test public void oldJavacBug() throws Exception { final String CLASS_NAME = "com.datadog.debugger.classfiles.JavacBug"; // compiled with jdk 1.6 diff --git a/dd-java-agent/agent-debugger/src/test/resources/classfiles/BooleanUtils.classfile b/dd-java-agent/agent-debugger/src/test/resources/classfiles/BooleanUtils.classfile new file mode 100644 index 0000000000000000000000000000000000000000..170d89ec2630b73e0063ebf3b734c2dff02da4a6 GIT binary patch literal 7137 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 literal 0 HcmV?d00001