Skip to content

Commit 384ba4b

Browse files
committed
Fix the JvmOptions parsing of procfs cmdline
1 parent 9bf0122 commit 384ba4b

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

components/environment/src/main/java/datadog/environment/JvmOptions.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,30 @@ List<String> findVmOptions(String[] procfsCmdline) {
5555
List<String> vmOptions = new ArrayList<>();
5656
// Start at 1 to skip "java" command itself
5757
int index = 1;
58-
// Look for main class or "-jar", end of VM options
58+
// Look for first self-standing argument that is not prefixed with "-" or end of VM options
59+
// Skip "-jar" and the jar file
5960
// Simultaneously, collect all arguments in the VM options
6061
for (; index < procfsCmdline.length; index++) {
6162
String argument = procfsCmdline[index];
62-
if (argument.startsWith("@")) {
63-
vmOptions.addAll(getArgumentsFromFile(argument));
64-
} else {
63+
if ("-jar".equals(argument)) {
64+
// skip "-jar" and the jar file
65+
index++;
66+
continue;
67+
} else if ("-cp".equals(argument)) {
68+
// slurp '-cp' and the classpath
6569
vmOptions.add(argument);
66-
}
67-
if (!argument.startsWith("-") || "-jar".equals(argument)) {
6870
if (index + 1 < procfsCmdline.length) {
69-
vmOptions.add(procfsCmdline[index + 1]); // jar file or the main class
71+
argument = procfsCmdline[++index];
7072
}
73+
} else if (!argument.startsWith("-")) {
74+
// end of VM options
7175
break;
7276
}
77+
if (argument.startsWith("@")) {
78+
vmOptions.addAll(getArgumentsFromFile(argument));
79+
} else {
80+
vmOptions.add(argument);
81+
}
7382
}
7483
// Insert JDK_JAVA_OPTIONS at the start if present and supported
7584
List<String> jdkJavaOptions = getJdkJavaOptions();

components/environment/src/test/java/datadog/environment/JvmOptionsTest.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,17 @@ private static Stream<Arguments> procFsCmdLine() {
122122
arguments(
123123
"Java with JAR and options",
124124
new String[]{"java", "-Xmx512m", "-Xms256m", "-jar", "app.jar"},
125-
asList("-Xmx512m", "-Xms256m", "-jar", "app.jar")
125+
asList("-Xmx512m", "-Xms256m")
126126
),
127127
arguments(
128128
"Java from class and options",
129129
new String[]{"java", "-Xmx512m", "-Xms256m", "-cp", "app.jar", "Main"},
130-
asList("-Xmx512m", "-Xms256m", "-cp", "app.jar", "Main")
130+
asList("-Xmx512m", "-Xms256m", "-cp", "app.jar")
131+
),
132+
arguments(
133+
"Java from class and options, mixed",
134+
new String[]{"java", "-Xms256m", "-cp", "app.jar", "-Xmx512m", "Main"},
135+
asList("-Xms256m", "-cp", "app.jar", "-Xmx512m")
131136
));
132137
// spotless:on
133138
}

0 commit comments

Comments
 (0)