Skip to content

Commit 3efcbc9

Browse files
committed
add checks around properties and env variables to avoid crashing if security manager is in the way
1 parent b233240 commit 3efcbc9

File tree

7 files changed

+56
-10
lines changed

7 files changed

+56
-10
lines changed

internal-api/src/main/java/datadog/trace/api/Config.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import datadog.trace.context.TraceScope;
4040
import datadog.trace.util.PidHelper;
4141
import datadog.trace.util.Strings;
42+
import datadog.trace.util.SystemUtils;
4243
import datadog.trace.util.throwable.FatalAgentMisconfigurationError;
4344
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
4445
import java.io.BufferedReader;
@@ -3917,7 +3918,7 @@ private static boolean isWindowsOS() {
39173918
}
39183919

39193920
private static String getEnv(String name) {
3920-
String value = System.getenv(name);
3921+
String value = SystemUtils.tryGetEnv(name);
39213922
if (value != null) {
39223923
ConfigCollector.get().put(name, value, ConfigOrigin.ENV);
39233924
}

internal-api/src/main/java/datadog/trace/api/env/CapturedEnvironment.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package datadog.trace.api.env;
22

33
import datadog.trace.api.config.GeneralConfig;
4+
import datadog.trace.util.SystemUtils;
45
import de.thetaphi.forbiddenapis.SuppressForbidden;
56
import java.io.File;
67
import java.util.HashMap;
@@ -40,8 +41,8 @@ static void useFixedEnv(final Map<String, String> props) {
4041
* autodetection will return either the JAR filename or the java main class.
4142
*/
4243
private String autodetectServiceName() {
43-
String inAas = System.getenv("DD_AZURE_APP_SERVICES");
44-
String siteName = System.getenv("WEBSITE_SITE_NAME");
44+
String inAas = SystemUtils.tryGetEnv("DD_AZURE_APP_SERVICES");
45+
String siteName = SystemUtils.tryGetEnv("WEBSITE_SITE_NAME");
4546

4647
if (("true".equalsIgnoreCase(inAas) || "1".equals(inAas)) && siteName != null) {
4748
return siteName;
@@ -50,7 +51,7 @@ private String autodetectServiceName() {
5051
// Besides "sun.java.command" property is not an standard, all main JDKs has set this property.
5152
// Tested on:
5253
// - OracleJDK, OpenJDK, AdoptOpenJDK, IBM JDK, Azul Zulu JDK, Amazon Coretto JDK
53-
return extractJarOrClass(System.getProperty("sun.java.command"));
54+
return extractJarOrClass(SystemUtils.tryGetProperty("sun.java.command"));
5455
}
5556

5657
@SuppressForbidden

internal-api/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package datadog.trace.bootstrap.config.provider;
22

33
import datadog.trace.util.Strings;
4+
import datadog.trace.util.SystemUtils;
45
import java.util.Map;
56

67
public class AgentArgsInjector {
@@ -21,14 +22,14 @@ public static void injectAgentArgsConfig(Map<String, String> args) {
2122
}
2223
for (Map.Entry<String, String> e : args.entrySet()) {
2324
String propertyName = e.getKey();
24-
String existingPropertyValue = System.getProperty(propertyName);
25+
String existingPropertyValue = SystemUtils.tryGetProperty(propertyName);
2526
if (existingPropertyValue != null) {
2627
// system properties should have higher priority than agent arguments
2728
continue;
2829
}
2930

3031
String envVarName = Strings.toEnvVar(propertyName);
31-
String envVarValue = System.getenv(envVarName);
32+
String envVarValue = SystemUtils.tryGetEnv(envVarName);
3233
if (envVarValue != null) {
3334
// env variables should have higher priority than agent arguments
3435
continue;

internal-api/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
import static datadog.trace.util.Strings.propertyNameToEnvironmentVariableName;
44

55
import datadog.trace.api.ConfigOrigin;
6+
import datadog.trace.util.SystemUtils;
67

78
final class EnvironmentConfigSource extends ConfigProvider.Source {
89

910
@Override
1011
protected String get(String key) {
11-
return System.getenv(propertyNameToEnvironmentVariableName(key));
12+
return SystemUtils.tryGetEnv(propertyNameToEnvironmentVariableName(key));
1213
}
1314

1415
@Override

internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import datadog.trace.api.TracePropagationStyle;
2020
import datadog.trace.api.telemetry.OtelEnvMetricCollector;
2121
import datadog.trace.util.Strings;
22+
import datadog.trace.util.SystemUtils;
2223
import java.io.BufferedInputStream;
2324
import java.io.File;
2425
import java.io.FileInputStream;
@@ -186,9 +187,9 @@ private String getDatadogProperty(String sysProp) {
186187
* <p>Checks system properties and environment variables.
187188
*/
188189
private static String getProperty(String sysProp) {
189-
String value = System.getProperty(sysProp);
190+
String value = SystemUtils.tryGetProperty(sysProp);
190191
if (null == value) {
191-
value = System.getenv(Strings.toEnvVar(sysProp));
192+
value = SystemUtils.tryGetEnv(Strings.toEnvVar(sysProp));
192193
}
193194
return value;
194195
}

internal-api/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
import static datadog.trace.util.Strings.propertyNameToSystemPropertyName;
44

55
import datadog.trace.api.ConfigOrigin;
6+
import datadog.trace.util.SystemUtils;
67

78
public final class SystemPropertiesConfigSource extends ConfigProvider.Source {
89

910
@Override
1011
protected String get(String key) {
11-
return System.getProperty(propertyNameToSystemPropertyName(key));
12+
return SystemUtils.tryGetProperty(propertyNameToSystemPropertyName(key));
1213
}
1314

1415
@Override
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package datadog.trace.util;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
6+
public final class SystemUtils {
7+
private static final Logger log = LoggerFactory.getLogger(SystemUtils.class);
8+
// to be templatized with the type of thing we wanted to access and the key
9+
private static final String logMessageOnSecurityError =
10+
"The Java Security Manager prevented the Datadog Tracer from accessing the {} '{}'. "
11+
+ "Consider granting AllPermission to the dd-java-agent jar.";
12+
13+
private SystemUtils() {}
14+
15+
public static String tryGetEnv(String envVar) {
16+
return getEnvOrDefault(envVar, null);
17+
}
18+
19+
public static String getEnvOrDefault(String envVar, String defaultValue) {
20+
try {
21+
return System.getenv(envVar);
22+
} catch (SecurityException e) {
23+
log.warn(logMessageOnSecurityError, "environment variable", envVar, e);
24+
return defaultValue;
25+
}
26+
}
27+
28+
public static String tryGetProperty(String property) {
29+
return getPropertyOrDefault(property, null);
30+
}
31+
32+
public static String getPropertyOrDefault(String property, String defaultValue) {
33+
try {
34+
return System.getProperty(property, defaultValue);
35+
} catch (SecurityException e) {
36+
log.warn(logMessageOnSecurityError, "system property", property, e);
37+
return defaultValue;
38+
}
39+
}
40+
}

0 commit comments

Comments
 (0)