From 6d022e7d8e2cb6e30dc1a1e7ecaa55a1b378ed7f Mon Sep 17 00:00:00 2001 From: Richard Gomez <32133502+rgmz@users.noreply.github.com> Date: Thu, 26 Sep 2024 12:44:59 -0400 Subject: [PATCH] fix(decoder): prevent race (#3031) --- pkg/decoders/escaped_unicode.go | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/pkg/decoders/escaped_unicode.go b/pkg/decoders/escaped_unicode.go index f1a523f23..31899ba1d 100644 --- a/pkg/decoders/escaped_unicode.go +++ b/pkg/decoders/escaped_unicode.go @@ -1,6 +1,7 @@ package decoders import ( + "bytes" "regexp" "strconv" "unicode/utf8" @@ -33,22 +34,34 @@ func (d *EscapedUnicode) FromChunk(chunk *sources.Chunk) *DecodableChunk { return nil } - matched := false - if codePointPat.Match(chunk.Data) { + var ( + // Necessary to avoid data races. + chunkData = bytes.Clone(chunk.Data) + matched = false + ) + if codePointPat.Match(chunkData) { matched = true - chunk.Data = decodeCodePoint(chunk.Data) + chunkData = decodeCodePoint(chunkData) } - if escapePat.Match(chunk.Data) { + if escapePat.Match(chunkData) { matched = true - chunk.Data = decodeEscaped(chunk.Data) + chunkData = decodeEscaped(chunkData) } if matched { - decodableChunk := &DecodableChunk{ + return &DecodableChunk{ DecoderType: d.Type(), - Chunk: chunk, + Chunk: &sources.Chunk{ + Data: chunkData, + SourceName: chunk.SourceName, + SourceID: chunk.SourceID, + JobID: chunk.JobID, + SecretID: chunk.SecretID, + SourceMetadata: chunk.SourceMetadata, + SourceType: chunk.SourceType, + Verify: chunk.Verify, + }, } - return decodableChunk } else { return nil }