From f1f46f4da11fc8076d346dd2e3687f96221d4f22 Mon Sep 17 00:00:00 2001 From: andres-portainer <91705312+andres-portainer@users.noreply.github.com> Date: Tue, 27 Jun 2023 16:42:52 -0300 Subject: [PATCH] fix(boltdb): remove undefined behavior when deleting objects while iterating EE-5643 (#9129) --- api/database/boltdb/tx.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/api/database/boltdb/tx.go b/api/database/boltdb/tx.go index 776736be7..7cc8bee7a 100644 --- a/api/database/boltdb/tx.go +++ b/api/database/boltdb/tx.go @@ -47,6 +47,8 @@ func (tx *DbTransaction) DeleteObject(bucketName string, key []byte) error { } func (tx *DbTransaction) DeleteAllObjects(bucketName string, obj interface{}, matchingFn func(o interface{}) (id int, ok bool)) error { + var ids []int + bucket := tx.tx.Bucket([]byte(bucketName)) cursor := bucket.Cursor() @@ -57,10 +59,13 @@ func (tx *DbTransaction) DeleteAllObjects(bucketName string, obj interface{}, ma } if id, ok := matchingFn(obj); ok { - err := bucket.Delete(tx.conn.ConvertToKey(id)) - if err != nil { - return err - } + ids = append(ids, id) + } + } + + for _, id := range ids { + if err := bucket.Delete(tx.conn.ConvertToKey(id)); err != nil { + return err } }