From d2b785acb1aeae9d83232dfabc73a79b10ecbc9f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 09:27:24 -0600 Subject: [PATCH] don't panic loading twice (#41857) (#41872) (cherry picked from commit ab0f3c836e4578b10fa59a0423fdc9ef83f89d66) Co-authored-by: Lee E Hinman <57081003+leehinman@users.noreply.github.com> --- CHANGELOG.next.asciidoc | 1 + libbeat/processors/namespace.go | 11 ++++++++--- libbeat/processors/namespace_test.go | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 146fc8ba1b7c..ad659714f8a9 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -110,6 +110,7 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] - Add `translate_ldap_attribute` processor. {pull}41472[41472] - Remove unnecessary debug logs during idle connection teardown {issue}40824[40824] - Fix incorrect cloud provider identification in add_cloud_metadata processor using provider priority mechanism {pull}41636[41636] +- Prevent panic if libbeat processors are loaded more than once. {issue}41475[41475] {pull}41857[51857] *Auditbeat* diff --git a/libbeat/processors/namespace.go b/libbeat/processors/namespace.go index 0ccf1deda458..5d015b16bcf1 100644 --- a/libbeat/processors/namespace.go +++ b/libbeat/processors/namespace.go @@ -38,6 +38,11 @@ type pluginer interface { Plugin() Constructor } +var ( + ErrExistsAlready error = errors.New("exists already") + ErrPluginAlreadyRegistered error = errors.New("non-namespace plugin already registered") +) + func NewNamespace() *Namespace { return &Namespace{ reg: map[string]pluginer{}, @@ -47,7 +52,7 @@ func NewNamespace() *Namespace { func (ns *Namespace) Register(name string, factory Constructor) error { p := plugin{NewConditional(factory)} names := strings.Split(name, ".") - if err := ns.add(names, p); err != nil { + if err := ns.add(names, p); err != nil && !errors.Is(err, ErrExistsAlready) && !errors.Is(err, ErrPluginAlreadyRegistered) { return fmt.Errorf("plugin %s registration fail %w", name, err) } return nil @@ -59,7 +64,7 @@ func (ns *Namespace) add(names []string, p pluginer) error { // register plugin if intermediate node in path being processed if len(names) == 1 { if _, found := ns.reg[name]; found { - return fmt.Errorf("%v exists already", name) + return fmt.Errorf("%s %w", name, ErrExistsAlready) } ns.reg[name] = p @@ -71,7 +76,7 @@ func (ns *Namespace) add(names []string, p pluginer) error { if found { ns, ok := tmp.(*Namespace) if !ok { - return errors.New("non-namespace plugin already registered") + return ErrPluginAlreadyRegistered } return ns.add(names[1:], p) } diff --git a/libbeat/processors/namespace_test.go b/libbeat/processors/namespace_test.go index 07c62328c2c1..221cee9b2e37 100644 --- a/libbeat/processors/namespace_test.go +++ b/libbeat/processors/namespace_test.go @@ -65,7 +65,7 @@ func TestNamespaceRegisterFail(t *testing.T) { fatalError(t, err) err = ns.Register("test", newTestFilterRule) - assert.Error(t, err) + assert.NoError(t, err) } func TestNamespaceError(t *testing.T) {