Skip to content

Commit 61d4e79

Browse files
authored
Merge branch 'master' into alejandro.gonzalez/APPSEC-61873-5-jersey-resteasy
2 parents 5ecceca + 8569434 commit 61d4e79

92 files changed

Lines changed: 7251 additions & 477 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/analyze-changes.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
with:
2121
submodules: 'recursive'
2222
- name: Cache Gradle dependencies
23-
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
23+
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
2424
with:
2525
path: |
2626
~/.gradle/caches
@@ -30,7 +30,7 @@ jobs:
3030
${{ runner.os }}-gradle-
3131
3232
- name: Initialize CodeQL
33-
uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
33+
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2
3434
with:
3535
languages: 'java'
3636
build-mode: 'manual'
@@ -43,7 +43,7 @@ jobs:
4343
./gradlew clean :dd-java-agent:shadowJar --build-cache --parallel --stacktrace --no-daemon --max-workers=4
4444
4545
- name: Perform CodeQL Analysis and upload results to GitHub Security tab
46-
uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
46+
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2
4747

4848
trivy:
4949
name: Analyze changes with Trivy
@@ -60,7 +60,7 @@ jobs:
6060
submodules: 'recursive'
6161

6262
- name: Cache Gradle dependencies
63-
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
63+
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
6464
with:
6565
path: |
6666
~/.gradle/caches
@@ -102,7 +102,7 @@ jobs:
102102
TRIVY_JAVA_DB_REPOSITORY: ghcr.io/aquasecurity/trivy-java-db,public.ecr.aws/aquasecurity/trivy-java-db
103103

104104
- name: Upload Trivy scan results to GitHub Security tab
105-
uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
105+
uses: github/codeql-action/upload-sarif@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2
106106
if: always()
107107
with:
108108
sarif_file: 'trivy-results.sarif'

.github/workflows/run-system-tests.yaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
fetch-depth: 0
3131

3232
- name: Cache Gradle dependencies
33-
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
33+
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
3434
with:
3535
path: |
3636
~/.gradle/caches
@@ -76,7 +76,10 @@ jobs:
7676
scenarios_groups: tracer-release
7777
excluded_scenarios: APM_TRACING_E2E_OTEL,APM_TRACING_E2E_SINGLE_SPAN,PROFILING # exclude flaky scenarios
7878
skip_empty_scenarios: true
79-
push_to_test_optimization: false # disabled to avoid pushing to Test Optimization while API key is transitioning to system-tests
79+
push_to_test_optimization: true
80+
secrets:
81+
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
82+
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
8083

8184
# Ensure the main job is run to completion
8285
check:

.gitlab-ci.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,29 @@ include:
44
- local: ".gitlab/macrobenchmarks.yml"
55
- local: ".gitlab/exploration-tests.yml"
66
- local: ".gitlab/ci-visibility-tests.yml"
7+
- project: 'DataDog/apm-reliability/apm-sdks-benchmarks'
8+
file: '.gitlab/ci-java-spring-petclinic-parallel.yml'
9+
ref: 'main'
10+
- project: 'DataDog/apm-reliability/apm-sdks-benchmarks'
11+
file: '.gitlab/ci-java-load-parallel.yml'
12+
ref: 'main'
13+
- project: 'DataDog/apm-reliability/apm-sdks-benchmarks'
14+
file: '.gitlab/ci-java-startup-parallel.yml'
15+
ref: 'main'
16+
- project: 'DataDog/apm-reliability/apm-sdks-benchmarks'
17+
file: '.gitlab/ci-java-dacapo-parallel.yml'
18+
ref: 'main'
19+
- local: ".gitlab/java-benchmark-configs.yml"
720

821
stages:
922
- build
1023
- publish
24+
# These benchmarks are intended to replace the legacy benchmarks in the future
25+
- java-spring-petclinic-parallel
26+
- java-spring-petclinic-parallel-slo
27+
- java-startup-parallel
28+
- java-load-parallel
29+
- java-dacapo-parallel
1130
- shared-pipeline
1231
- benchmarks
1332
- macrobenchmarks

.gitlab/java-benchmark-configs.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Ensure the tracer artifact publish finishes before the benchmark jobs start.
2+
linux-java-spring-petclinic-parallel:
3+
needs: ["publish-artifacts-to-s3"]
4+
5+
linux-java-insecure-bank-load-parallel:
6+
needs: ["publish-artifacts-to-s3"]
7+
8+
linux-java-spring-petclinic-load-parallel:
9+
needs: ["publish-artifacts-to-s3"]
10+
11+
linux-java-insecure-bank-startup-parallel:
12+
needs: ["publish-artifacts-to-s3"]
13+
14+
linux-java-spring-petclinic-startup-parallel:
15+
needs: ["publish-artifacts-to-s3"]
16+
17+
linux-java-dacapo-parallel-1:
18+
needs: ["publish-artifacts-to-s3"]
19+
20+
linux-java-dacapo-parallel-2:
21+
needs: ["publish-artifacts-to-s3"]

dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/ConfigManager.java

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@
1212
import datadog.trace.util.RandomUtils;
1313
import java.io.BufferedReader;
1414
import java.io.BufferedWriter;
15+
import java.io.File;
16+
import java.io.FileInputStream;
17+
import java.io.FileOutputStream;
1518
import java.io.IOException;
16-
import java.nio.file.Files;
17-
import java.nio.file.Path;
19+
import java.io.InputStreamReader;
20+
import java.io.OutputStreamWriter;
21+
import java.nio.charset.StandardCharsets;
1822
import java.util.regex.Pattern;
1923
import java.util.stream.Collectors;
2024
import javax.annotation.Nullable;
@@ -157,8 +161,8 @@ public StoredConfig build() {
157161

158162
private ConfigManager() {}
159163

160-
private static String getBaseName(Path path) {
161-
String filename = path.getFileName().toString();
164+
private static String getBaseName(File file) {
165+
String filename = file.getName();
162166
int dotIndex = filename.lastIndexOf('.');
163167
if (dotIndex == -1) {
164168
return filename;
@@ -185,18 +189,20 @@ private static void writeEntry(BufferedWriter writer, CharSequence key, CharSequ
185189
writer.newLine();
186190
}
187191

188-
public static void writeConfigToPath(Path scriptPath, String... additionalEntries) {
189-
String cfgFileName = getBaseName(scriptPath) + PID_PREFIX + PidHelper.getPid() + ".cfg";
190-
Path cfgPath = scriptPath.resolveSibling(cfgFileName);
191-
writeConfigToFile(Config.get(), cfgPath, additionalEntries);
192+
public static void writeConfigToPath(File scriptFile, String... additionalEntries) {
193+
String cfgFileName = getBaseName(scriptFile) + PID_PREFIX + PidHelper.getPid() + ".cfg";
194+
File cfgFile = new File(scriptFile.getParentFile(), cfgFileName);
195+
writeConfigToFile(Config.get(), cfgFile, additionalEntries);
192196
}
193197

194198
// @VisibleForTesting
195-
static void writeConfigToFile(Config config, Path cfgPath, String... additionalEntries) {
199+
static void writeConfigToFile(Config config, File cfgFile, String... additionalEntries) {
196200
final WellKnownTags wellKnownTags = config.getWellKnownTags();
197201

198-
LOGGER.debug("Writing config file: {}", cfgPath);
199-
try (BufferedWriter bw = Files.newBufferedWriter(cfgPath)) {
202+
LOGGER.debug("Writing config file: {}", cfgFile);
203+
try (BufferedWriter bw =
204+
new BufferedWriter(
205+
new OutputStreamWriter(new FileOutputStream(cfgFile), StandardCharsets.UTF_8))) {
200206
for (int i = 0; i < additionalEntries.length; i += 2) {
201207
writeEntry(bw, additionalEntries[i], additionalEntries[i + 1]);
202208
}
@@ -217,27 +223,21 @@ static void writeConfigToFile(Config config, Path cfgPath, String... additionalE
217223
new Thread(
218224
AGENT_THREAD_GROUP,
219225
() -> {
220-
try {
221-
LOGGER.debug("Deleting config file: {}", cfgPath);
222-
Files.deleteIfExists(cfgPath);
223-
} catch (IOException e) {
224-
LOGGER.warn(SEND_TELEMETRY, "Failed deleting config file: {}", cfgPath, e);
225-
}
226+
LOGGER.debug("Deleting config file: {}", cfgFile);
227+
cfgFile.delete();
226228
}));
227-
LOGGER.debug("Config file written: {}", cfgPath);
229+
LOGGER.debug("Config file written: {}", cfgFile);
228230
} catch (IOException e) {
229-
LOGGER.warn(SEND_TELEMETRY, "Failed writing config file: {}", cfgPath);
230-
try {
231-
Files.deleteIfExists(cfgPath);
232-
} catch (IOException ignored) {
233-
// ignore
234-
}
231+
LOGGER.warn(SEND_TELEMETRY, "Failed writing config file: {}", cfgFile);
232+
cfgFile.delete(); // best-effort cleanup; failure is acceptable here
235233
}
236234
}
237235

238236
@Nullable
239-
public static StoredConfig readConfig(Config config, Path scriptPath) {
240-
try (final BufferedReader reader = Files.newBufferedReader(scriptPath)) {
237+
public static StoredConfig readConfig(Config config, File scriptFile) {
238+
try (final BufferedReader reader =
239+
new BufferedReader(
240+
new InputStreamReader(new FileInputStream(scriptFile), StandardCharsets.UTF_8))) {
241241
final StoredConfig.Builder cfgBuilder = new StoredConfig.Builder(config);
242242
String line;
243243
while ((line = reader.readLine()) != null) {
@@ -284,7 +284,7 @@ public static StoredConfig readConfig(Config config, Path scriptPath) {
284284
}
285285
return cfgBuilder.build();
286286
} catch (Throwable t) {
287-
LOGGER.error("Failed to read config file: {}", scriptPath, t);
287+
LOGGER.error("Failed to read config file: {}", scriptFile, t);
288288
}
289289
return null;
290290
}

dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderScriptInitializer.java

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,23 @@
22

33
import static datadog.crashtracking.ConfigManager.writeConfigToPath;
44
import static datadog.crashtracking.Initializer.LOG;
5-
import static datadog.crashtracking.Initializer.RWXRWXRWX;
6-
import static datadog.crashtracking.Initializer.R_XR_XR_X;
75
import static datadog.crashtracking.Initializer.findAgentJar;
86
import static datadog.crashtracking.Initializer.getCrashUploaderTemplate;
97
import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY;
10-
import static java.nio.file.attribute.PosixFilePermissions.asFileAttribute;
11-
import static java.nio.file.attribute.PosixFilePermissions.fromString;
128
import static java.util.Locale.ROOT;
139

1410
import datadog.environment.SystemProperties;
1511
import datadog.trace.util.PidHelper;
1612
import datadog.trace.util.Strings;
1713
import java.io.BufferedReader;
1814
import java.io.BufferedWriter;
15+
import java.io.File;
16+
import java.io.FileOutputStream;
1917
import java.io.IOException;
2018
import java.io.InputStream;
2119
import java.io.InputStreamReader;
22-
import java.nio.file.FileAlreadyExistsException;
23-
import java.nio.file.Files;
24-
import java.nio.file.Path;
25-
import java.nio.file.Paths;
20+
import java.io.OutputStreamWriter;
21+
import java.nio.charset.StandardCharsets;
2622

2723
public final class CrashUploaderScriptInitializer {
2824
private static final String SETUP_FAILURE_MESSAGE = "Crash tracking will not work properly.";
@@ -54,71 +50,78 @@ static void initialize(String onErrorVal, String onErrorFile, String javacorePat
5450
return;
5551
}
5652

57-
Path scriptPath = Paths.get(onErrorVal.replace(" %p", ""));
53+
File scriptFile = new File(onErrorVal.replace(" %p", ""));
5854
boolean isDDCrashUploader =
59-
scriptPath.getFileName().toString().toLowerCase(ROOT).contains("dd_crash_uploader");
60-
if (isDDCrashUploader && !copyCrashUploaderScript(scriptPath, onErrorFile, agentJar)) {
55+
scriptFile.getName().toLowerCase(ROOT).contains("dd_crash_uploader");
56+
if (isDDCrashUploader && !copyCrashUploaderScript(scriptFile, onErrorFile, agentJar)) {
6157
return;
6258
}
6359

6460
if (javacorePath != null && !javacorePath.isEmpty()) {
65-
writeConfigToPath(scriptPath, "agent", agentJar, "javacore_path", javacorePath);
61+
writeConfigToPath(scriptFile, "agent", agentJar, "javacore_path", javacorePath);
6662
} else {
67-
writeConfigToPath(scriptPath, "agent", agentJar, "hs_err", onErrorFile);
63+
writeConfigToPath(scriptFile, "agent", agentJar, "hs_err", onErrorFile);
6864
}
6965
}
7066

7167
private static boolean copyCrashUploaderScript(
72-
Path scriptPath, String onErrorFile, String agentJar) {
73-
Path scriptDirectory = scriptPath.getParent();
74-
try {
75-
Files.createDirectories(scriptDirectory, asFileAttribute(fromString(RWXRWXRWX)));
76-
} catch (UnsupportedOperationException e) {
77-
LOG.warn(
78-
SEND_TELEMETRY,
79-
"Unsupported permissions '" + RWXRWXRWX + "' for {}. " + SETUP_FAILURE_MESSAGE,
80-
scriptDirectory);
81-
return false;
82-
} catch (FileAlreadyExistsException ignored) {
83-
// can be safely ignored; if the folder exists we will just reuse it
84-
if (!Files.isWritable(scriptDirectory)) {
68+
File scriptFile, String onErrorFile, String agentJar) {
69+
File scriptDirectory = scriptFile.getParentFile();
70+
if (!scriptDirectory.exists()) {
71+
if (!scriptDirectory.mkdirs()) {
8572
LOG.warn(
86-
SEND_TELEMETRY, "Read only directory {}. " + SETUP_FAILURE_MESSAGE, scriptDirectory);
73+
SEND_TELEMETRY,
74+
"Failed to create writable crash tracking script folder {}. " + SETUP_FAILURE_MESSAGE,
75+
scriptDirectory);
8776
return false;
8877
}
89-
} catch (IOException e) {
90-
LOG.warn(
91-
SEND_TELEMETRY,
92-
"Failed to create writable crash tracking script folder {}. " + SETUP_FAILURE_MESSAGE,
93-
scriptDirectory);
78+
boolean permissionFailure = false;
79+
permissionFailure |= !scriptDirectory.setReadable(true, false);
80+
permissionFailure |= !scriptDirectory.setWritable(true, false);
81+
permissionFailure |= !scriptDirectory.setExecutable(true, false);
82+
if (permissionFailure) {
83+
LOG.warn(
84+
SEND_TELEMETRY,
85+
"Failed to set permissions on crash tracking script folder {}. {}",
86+
scriptDirectory,
87+
SETUP_FAILURE_MESSAGE);
88+
}
89+
}
90+
if (!scriptDirectory.canWrite()) {
91+
LOG.warn(SEND_TELEMETRY, "Read only directory {}. " + SETUP_FAILURE_MESSAGE, scriptDirectory);
9492
return false;
9593
}
9694
try {
97-
LOG.debug("Writing crash uploader script: {}", scriptPath);
98-
writeCrashUploaderScript(getCrashUploaderTemplate(), scriptPath, agentJar, onErrorFile);
95+
LOG.debug("Writing crash uploader script: {}", scriptFile);
96+
writeCrashUploaderScript(getCrashUploaderTemplate(), scriptFile, agentJar, onErrorFile);
9997
} catch (IOException e) {
10098
LOG.warn(
10199
SEND_TELEMETRY,
102100
"Failed to copy crash tracking script {}. " + SETUP_FAILURE_MESSAGE,
103-
scriptPath);
101+
scriptFile);
104102
return false;
105103
}
106104
return true;
107105
}
108106

109107
private static void writeCrashUploaderScript(
110-
InputStream template, Path scriptPath, String execClass, String crashFile)
108+
InputStream template, File scriptFile, String execClass, String crashFile)
111109
throws IOException {
112-
if (!Files.exists(scriptPath)) {
110+
if (!scriptFile.exists()) {
113111
try (BufferedReader br = new BufferedReader(new InputStreamReader(template));
114-
BufferedWriter bw = Files.newBufferedWriter(scriptPath)) {
112+
BufferedWriter bw =
113+
new BufferedWriter(
114+
new OutputStreamWriter(
115+
new FileOutputStream(scriptFile), StandardCharsets.UTF_8))) {
115116
String line;
116117
while ((line = br.readLine()) != null) {
117118
bw.write(template(line, execClass, crashFile));
118119
bw.newLine();
119120
}
120121
}
121-
Files.setPosixFilePermissions(scriptPath, fromString(R_XR_XR_X));
122+
scriptFile.setReadable(true, false);
123+
scriptFile.setWritable(false, false);
124+
scriptFile.setExecutable(true, false);
122125
}
123126
}
124127

0 commit comments

Comments
 (0)