Skip to content

Commit 8f413da

Browse files
committed
addess review comments
1 parent b1c4c59 commit 8f413da

File tree

7 files changed

+38
-32
lines changed

7 files changed

+38
-32
lines changed

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

+8-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import java.io.File;
1212
import java.io.IOException;
1313
import java.lang.instrument.Instrumentation;
14-
import java.net.JarURLConnection;
1514
import java.net.URISyntaxException;
1615
import java.net.URL;
1716
import java.util.jar.JarFile;
@@ -67,10 +66,12 @@ private static synchronized File installBootstrapJar(Instrumentation inst)
6766
throws IOException, URISyntaxException {
6867
// we are not using OpenTelemetryAgent.class.getProtectionDomain().getCodeSource() to get agent
6968
// location because getProtectionDomain does a permission check with security manager
69+
ClassLoader classLoader = OpenTelemetryAgent.class.getClassLoader();
70+
if (classLoader == null) {
71+
classLoader = ClassLoader.getSystemClassLoader();
72+
}
7073
URL url =
71-
OpenTelemetryAgent.class
72-
.getClassLoader()
73-
.getResource(OpenTelemetryAgent.class.getName().replace('.', '/') + ".class");
74+
classLoader.getResource(OpenTelemetryAgent.class.getName().replace('.', '/') + ".class");
7475
if (url == null || !"jar".equals(url.getProtocol())) {
7576
throw new IllegalStateException("could not get agent jar location from url " + url);
7677
}
@@ -88,7 +89,9 @@ private static synchronized File installBootstrapJar(Instrumentation inst)
8889
"agent jar location doesn't appear to be a file: " + javaagentFile.getAbsolutePath());
8990
}
9091

91-
JarFile agentJar = ((JarURLConnection) url.openConnection()).getJarFile();
92+
// verification is very slow before the JIT compiler starts up, which on Java 8 is not until
93+
// after premain execution completes
94+
JarFile agentJar = new JarFile(javaagentFile, false);
9295
verifyJarManifestMainClassIsThis(javaagentFile, agentJar);
9396
inst.appendToBootstrapClassLoaderSearch(agentJar);
9497
return javaagentFile;

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

-2
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,6 @@ public AgentClassLoader(
105105
jarBase =
106106
new URL("x-internal-jar", null, 0, "/", new AgentClassLoaderUrlStreamHandler(jarFile));
107107
codeSource = new CodeSource(javaagentFile.toURI().toURL(), (Certificate[]) null);
108-
Permissions permissions = new Permissions();
109-
permissions.add(new AllPermission());
110108
manifest = jarFile.getManifest();
111109
} catch (IOException e) {
112110
throw new IllegalStateException("Unable to open agent jar", e);

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ private static void execute(PrivilegedExceptionAction<Void> action) throws Excep
6666
}
6767

6868
private static boolean isSecurityManagerSupportEnabled() {
69-
return getBoolean("otel.javaagent.experimental.security-manager.enabled", false);
69+
return getBoolean("otel.javaagent.experimental.security-manager-support.enabled", false);
7070
}
7171

7272
private static boolean getBoolean(String property, boolean defaultValue) {
@@ -173,8 +173,9 @@ private static AgentStarter createAgentStarter(
173173
Class<?> starterClass =
174174
agentClassLoader.loadClass("io.opentelemetry.javaagent.tooling.AgentStarterImpl");
175175
Constructor<?> constructor =
176-
starterClass.getDeclaredConstructor(Instrumentation.class, File.class);
177-
return (AgentStarter) constructor.newInstance(instrumentation, javaagentFile);
176+
starterClass.getDeclaredConstructor(Instrumentation.class, File.class, boolean.class);
177+
return (AgentStarter)
178+
constructor.newInstance(instrumentation, javaagentFile, isSecurityManagerSupportEnabled);
178179
}
179180

180181
private AgentInitializer() {}

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,16 @@
3030
public class AgentStarterImpl implements AgentStarter {
3131
private final Instrumentation instrumentation;
3232
private final File javaagentFile;
33+
private final boolean isSecurityManagerSupportEnabled;
3334
private ClassLoader extensionClassLoader;
3435

35-
public AgentStarterImpl(Instrumentation instrumentation, File javaagentFile) {
36+
public AgentStarterImpl(
37+
Instrumentation instrumentation,
38+
File javaagentFile,
39+
boolean isSecurityManagerSupportEnabled) {
3640
this.instrumentation = instrumentation;
3741
this.javaagentFile = javaagentFile;
42+
this.isSecurityManagerSupportEnabled = isSecurityManagerSupportEnabled;
3843
}
3944

4045
@Override
@@ -62,7 +67,7 @@ public boolean delayStart() {
6267

6368
@Override
6469
public void start() {
65-
extensionClassLoader = createExtensionClassLoader(getClass().getClassLoader(), javaagentFile);
70+
extensionClassLoader = createExtensionClassLoader(getClass().getClassLoader());
6671

6772
Iterator<LoggingCustomizer> loggingCustomizers =
6873
ServiceLoader.load(LoggingCustomizer.class, extensionClassLoader).iterator();
@@ -100,9 +105,9 @@ public ClassLoader getExtensionClassLoader() {
100105
return extensionClassLoader;
101106
}
102107

103-
private static ClassLoader createExtensionClassLoader(
104-
ClassLoader agentClassLoader, File javaagentFile) {
105-
return ExtensionClassLoader.getInstance(agentClassLoader, javaagentFile);
108+
private ClassLoader createExtensionClassLoader(ClassLoader agentClassLoader) {
109+
return ExtensionClassLoader.getInstance(
110+
agentClassLoader, javaagentFile, isSecurityManagerSupportEnabled);
106111
}
107112

108113
private static class LaunchHelperClassFileTransformer implements ClassFileTransformer {

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/ExtensionClassLoader.java

+13-15
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,8 @@
4040
@SuppressWarnings({"unused", "SystemOut"})
4141
public class ExtensionClassLoader extends URLClassLoader {
4242
public static final String EXTENSIONS_CONFIG = "otel.javaagent.extensions";
43-
// if this class was defined with all permissions then also define classes in this class loader
44-
// with all permissions
45-
// this class is defined with all permissions when security manager support is enabled
46-
private static final boolean addAllPermissions =
47-
ExtensionClassLoader.class
48-
.getProtectionDomain()
49-
.getPermissions()
50-
.implies(new AllPermission());
43+
44+
private final boolean isSecurityManagerSupportEnabled;
5145

5246
// NOTE it's important not to use logging in this class, because this class is used before logging
5347
// is initialized
@@ -56,7 +50,8 @@ public class ExtensionClassLoader extends URLClassLoader {
5650
ClassLoader.registerAsParallelCapable();
5751
}
5852

59-
public static ClassLoader getInstance(ClassLoader parent, File javaagentFile) {
53+
public static ClassLoader getInstance(
54+
ClassLoader parent, File javaagentFile, boolean isSecurityManagerSupportEnabled) {
6055
List<URL> extensions = new ArrayList<>();
6156

6257
includeEmbeddedExtensionsIfFound(parent, extensions, javaagentFile);
@@ -81,7 +76,7 @@ public static ClassLoader getInstance(ClassLoader parent, File javaagentFile) {
8176

8277
List<ClassLoader> delegates = new ArrayList<>(extensions.size());
8378
for (URL url : extensions) {
84-
delegates.add(getDelegate(parent, url));
79+
delegates.add(getDelegate(parent, url, isSecurityManagerSupportEnabled));
8580
}
8681
return new MultipleParentClassLoader(parent, delegates);
8782
}
@@ -132,8 +127,9 @@ private static File ensureTempDirectoryExists(File tempDirectory) throws IOExcep
132127
return tempDirectory;
133128
}
134129

135-
private static URLClassLoader getDelegate(ClassLoader parent, URL extensionUrl) {
136-
return new ExtensionClassLoader(new URL[] {extensionUrl}, parent);
130+
private static URLClassLoader getDelegate(
131+
ClassLoader parent, URL extensionUrl, boolean isSecurityManagerSupportEnabled) {
132+
return new ExtensionClassLoader(extensionUrl, parent, isSecurityManagerSupportEnabled);
137133
}
138134

139135
// visible for testing
@@ -194,15 +190,17 @@ private static void extractFile(JarFile jarFile, JarEntry jarEntry, File outputF
194190

195191
@Override
196192
protected PermissionCollection getPermissions(CodeSource codesource) {
197-
if (addAllPermissions) {
193+
if (isSecurityManagerSupportEnabled) {
198194
Permissions permissions = new Permissions();
199195
permissions.add(new AllPermission());
200196
return permissions;
201197
}
202198
return super.getPermissions(codesource);
203199
}
204200

205-
private ExtensionClassLoader(URL[] urls, ClassLoader parent) {
206-
super(urls, parent);
201+
private ExtensionClassLoader(
202+
URL url, ClassLoader parent, boolean isSecurityManagerSupportEnabled) {
203+
super(new URL[] {url}, parent);
204+
this.isSecurityManagerSupportEnabled = isSecurityManagerSupportEnabled;
207205
}
208206
}

muzzle/src/main/java/io/opentelemetry/javaagent/tooling/HelperInjector.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,8 @@ private static class HelperClassInjector {
390390

391391
Class<?> inject(ClassLoader classLoader, String className) {
392392
// if security manager is present byte buddy calls
393-
// checkPermission(new ReflectPermission("suppressAccessChecks"))
393+
// checkPermission(new ReflectPermission("suppressAccessChecks")) so we must call class
394+
// injection with AccessController.doPrivileged when security manager is enabled
394395
Map<String, Class<?>> result =
395396
execute(
396397
() ->

smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SecurityManagerSmokeTest.groovy

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class SecurityManagerSmokeTest extends SmokeTest {
2121

2222
@Override
2323
protected Map<String, String> getExtraEnv() {
24-
return Collections.singletonMap("OTEL_JAVAAGENT_EXPERIMENTAL_SECURITY_MANAGER_ENABLED", "true")
24+
return Collections.singletonMap("OTEL_JAVAAGENT_EXPERIMENTAL_SECURITY_MANAGER_SUPPORT_ENABLED", "true")
2525
}
2626

2727
@Unroll

0 commit comments

Comments
 (0)