From 1e01ca2880160cb14775d98280ca8a905fc58fd2 Mon Sep 17 00:00:00 2001 From: Joe Gallo Date: Mon, 17 Feb 2025 08:51:02 -0500 Subject: [PATCH] Fix redact processor arraycopy bug (#122640) --- docs/changelog/122640.yaml | 5 +++++ .../elasticsearch/xpack/redact/RedactProcessor.java | 8 ++++++-- .../xpack/redact/RedactProcessorTests.java | 12 ++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 docs/changelog/122640.yaml diff --git a/docs/changelog/122640.yaml b/docs/changelog/122640.yaml new file mode 100644 index 0000000000000..f46fc55fc5396 --- /dev/null +++ b/docs/changelog/122640.yaml @@ -0,0 +1,5 @@ +pr: 122640 +summary: Fix redact processor arraycopy bug +area: Ingest Node +type: bug +issues: [] diff --git a/x-pack/plugin/redact/src/main/java/org/elasticsearch/xpack/redact/RedactProcessor.java b/x-pack/plugin/redact/src/main/java/org/elasticsearch/xpack/redact/RedactProcessor.java index 187126fb31e3e..c378b822ce0b0 100644 --- a/x-pack/plugin/redact/src/main/java/org/elasticsearch/xpack/redact/RedactProcessor.java +++ b/x-pack/plugin/redact/src/main/java/org/elasticsearch/xpack/redact/RedactProcessor.java @@ -294,9 +294,13 @@ public void extract(byte[] utf8Bytes, int offset, Region region) { */ String redactMatches(byte[] utf8Bytes, String redactStartToken, String redactEndToken) { var merged = mergeOverlappingReplacements(replacementPositions); - int longestPatternName = merged.stream().mapToInt(r -> r.patternName.getBytes(StandardCharsets.UTF_8).length).max().getAsInt(); + int maxPatternNameLength = merged.stream() + .mapToInt(r -> r.patternName.getBytes(StandardCharsets.UTF_8).length) + .max() + .getAsInt(); - int maxPossibleLength = longestPatternName * merged.size() + utf8Bytes.length; + int maxPossibleLength = (redactStartToken.length() + maxPatternNameLength + redactEndToken.length()) * merged.size() + + utf8Bytes.length; byte[] redact = new byte[maxPossibleLength]; int readOffset = 0; diff --git a/x-pack/plugin/redact/src/test/java/org/elasticsearch/xpack/redact/RedactProcessorTests.java b/x-pack/plugin/redact/src/test/java/org/elasticsearch/xpack/redact/RedactProcessorTests.java index 76bf99d170a8f..bf287735d9fc3 100644 --- a/x-pack/plugin/redact/src/test/java/org/elasticsearch/xpack/redact/RedactProcessorTests.java +++ b/x-pack/plugin/redact/src/test/java/org/elasticsearch/xpack/redact/RedactProcessorTests.java @@ -108,6 +108,18 @@ public void testMatchRedact() throws Exception { var redacted = RedactProcessor.matchRedact(input, List.of(grok)); assertEquals(" ", redacted); } + { + var config = new HashMap(); + config.put("field", "to_redact"); + config.put("patterns", List.of("%{NUMBER:NUMBER}")); + config.put("pattern_definitions", Map.of("NUMBER", "\\d{4}")); + var processor = new RedactProcessor.Factory(mockLicenseState(), MatcherWatchdog.noop()).create(null, "t", "d", config); + var grok = processor.getGroks().get(0); + + String input = "1001"; + var redacted = RedactProcessor.matchRedact(input, List.of(grok), "_prefix_", "_suffix_"); + assertEquals("_prefix_NUMBER_suffix_", redacted); + } } public void testMatchRedactMultipleGroks() throws Exception {