diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 15338b7b06f..5b90a7a7c28 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -66,6 +66,7 @@ https://github.com/elastic/beats/compare/v7.1.1...v7.2.0[View commits] - Add host.os.codename to fields.yml. {pull}12261[12261] - Fix `@timestamp` being duplicated in events if `@timestamp` is set in a processor (or by any code utilizing `PutValue()` on a `beat.Event`). +- Fix leak in script processor when using Javascript functions in a processor chain. {pull}12600[12600] *Auditbeat* diff --git a/libbeat/processors/script/javascript/module/processor/chain.go b/libbeat/processors/script/javascript/module/processor/chain.go index f86300c213b..dd61022c29c 100644 --- a/libbeat/processors/script/javascript/module/processor/chain.go +++ b/libbeat/processors/script/javascript/module/processor/chain.go @@ -83,7 +83,7 @@ func (b *chainBuilder) Add(call goja.FunctionCall) goja.Value { case *beatProcessor: b.procs = append(b.procs, v.p) case func(goja.FunctionCall) goja.Value: - b.procs = append(b.procs, &jsProcessor{fn: v}) + b.procs = append(b.procs, newJSProcessor(v)) default: panic(b.runtime.NewGoError(errors.Errorf("arg0 must be a processor object, but got %T", a0.Export()))) } @@ -119,9 +119,12 @@ type jsProcessor struct { call goja.FunctionCall } +func newJSProcessor(fn jsFunction) *jsProcessor { + return &jsProcessor{fn: fn, call: goja.FunctionCall{Arguments: make([]goja.Value, 1)}} +} + func (p *jsProcessor) run(event javascript.Event) error { - p.call.Arguments = p.call.Arguments[0:] - p.call.Arguments = append(p.call.Arguments, event.JSObject()) + p.call.Arguments[0] = event.JSObject() p.fn(p.call) return nil }