diff --git a/exporter/containerimage/export.go b/exporter/containerimage/export.go index 3f8865f8e..9a0b30ba4 100644 --- a/exporter/containerimage/export.go +++ b/exporter/containerimage/export.go @@ -188,6 +188,7 @@ func (e *imageExporterInstance) Config() *exporter.Config { } func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source, sessionID string) (_ map[string]string, descref exporter.DescriptorReference, err error) { + src = src.Clone() if src.Metadata == nil { src.Metadata = make(map[string][]byte) } diff --git a/exporter/oci/export.go b/exporter/oci/export.go index f1a1aa55c..b6124172a 100644 --- a/exporter/oci/export.go +++ b/exporter/oci/export.go @@ -117,6 +117,7 @@ func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source return nil, nil, errors.Errorf("docker exporter does not currently support exporting manifest lists") } + src = src.Clone() if src.Metadata == nil { src.Metadata = make(map[string][]byte) } diff --git a/solver/result/result.go b/solver/result/result.go index cfcfe9dcb..644ec5d0f 100644 --- a/solver/result/result.go +++ b/solver/result/result.go @@ -1,6 +1,7 @@ package result import ( + "maps" "sync" "github.com/pkg/errors" @@ -14,6 +15,15 @@ type Result[T comparable] struct { Attestations map[string][]Attestation[T] } +func (r *Result[T]) Clone() *Result[T] { + return &Result[T]{ + Ref: r.Ref, + Refs: maps.Clone(r.Refs), + Metadata: maps.Clone(r.Metadata), + Attestations: maps.Clone(r.Attestations), + } +} + func (r *Result[T]) AddMeta(k string, v []byte) { r.mu.Lock() if r.Metadata == nil {