From 3af99812247a3051c8a3c6fa8a61a51a26b29bb7 Mon Sep 17 00:00:00 2001 From: Sheikah45 Date: Wed, 12 Nov 2025 05:58:35 -0500 Subject: [PATCH] Don't expose underlying replay data buffer --- .../commons/replay/ReplayDataParser.java | 22 +++++++++++-------- .../replay/ReplayLoaderTableParserTest.java | 4 ++-- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/data/src/main/java/com/faforever/commons/replay/ReplayDataParser.java b/data/src/main/java/com/faforever/commons/replay/ReplayDataParser.java index 5bf4cf58..9b1be4a0 100644 --- a/data/src/main/java/com/faforever/commons/replay/ReplayDataParser.java +++ b/data/src/main/java/com/faforever/commons/replay/ReplayDataParser.java @@ -44,8 +44,7 @@ public class ReplayDataParser { private ReplayMetadata metadata; @Getter private String replayPatchFieldId; - @Getter - private ByteBuffer data; + private ByteBuffer dataBuffer; @Getter private String map; @Getter @@ -136,7 +135,7 @@ private void readReplayData(Path replayFile) throws IOException, CompressorExcep buffer.limit(buffer.capacity()); buffer.position(headerEnd + 1); - data = decompress(buffer, metadata); + dataBuffer = decompress(buffer, metadata); } private int findReplayHeaderEnd(byte[] replayData) { @@ -442,15 +441,20 @@ private Duration tickToTime(int tick) { private void parse() throws IOException, CompressorException { readReplayData(path); - data.order(ByteOrder.LITTLE_ENDIAN); + dataBuffer.order(ByteOrder.LITTLE_ENDIAN); - parseHeader(data); + parseHeader(dataBuffer); - var rewindPosition = data.position(); - tokens = ReplayBodyTokenizer.tokenize(data); - data.position(rewindPosition); + var rewindPosition = dataBuffer.position(); + tokens = ReplayBodyTokenizer.tokenize(dataBuffer); + dataBuffer.position(rewindPosition); - events = ReplayBodyParser.parseTokens(tokens, data); + events = ReplayBodyParser.parseTokens(tokens, dataBuffer); interpretEvents(events); } + + public byte[] getRawReplayData() { + byte[] backingArray = dataBuffer.array(); + return Arrays.copyOf(backingArray, backingArray.length); + } } diff --git a/data/src/test/java/com/faforever/commons/replay/ReplayLoaderTableParserTest.java b/data/src/test/java/com/faforever/commons/replay/ReplayLoaderTableParserTest.java index b7a22c37..a2dc53e3 100644 --- a/data/src/test/java/com/faforever/commons/replay/ReplayLoaderTableParserTest.java +++ b/data/src/test/java/com/faforever/commons/replay/ReplayLoaderTableParserTest.java @@ -108,7 +108,7 @@ public void testReferenceZstd() throws Exception { Files.copy(getClass().getResourceAsStream("/replay/zstd_reference.fafreplay"), replayFile); Files.copy(getClass().getResourceAsStream("/replay/zstd_reference.raw"), referenceFile); - byte[] data = new ReplayDataParser(replayFile, objectMapper).getData().array(); + byte[] data = new ReplayDataParser(replayFile, objectMapper).getRawReplayData(); byte[] reference = Files.readAllBytes(referenceFile); assertThat("Zstd compressed replay matches reference", Arrays.equals(data, reference)); } @@ -120,7 +120,7 @@ public void testLegacyFormat() throws Exception { Files.copy(getClass().getResourceAsStream("/replay/test.fafreplay"), replayFile); Files.copy(getClass().getResourceAsStream("/replay/test.raw"), referenceFile); - byte[] data = new ReplayDataParser(replayFile, objectMapper).getData().array(); + byte[] data = new ReplayDataParser(replayFile, objectMapper).getRawReplayData(); byte[] reference = Files.readAllBytes(referenceFile); assertThat("Legacy compressed file matches reference", Arrays.equals(data, reference)); }