From b0103744b8b2c48e9f8938ff6c2bf3b95ad95406 Mon Sep 17 00:00:00 2001 From: Amine Date: Fri, 20 Feb 2026 15:41:29 -0800 Subject: [PATCH] Fix map mutation during iteration in renameExportable renameExportable() deletes and inserts map keys while iterating MemberRefs. Go may revisit newly-inserted keys, overwriting OriginalMemberName with the exported name instead of the original. Snapshot keys before iterating to prevent this. --- pkg/api/passes.go | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/pkg/api/passes.go b/pkg/api/passes.go index 2a1c435c..8e3a66eb 100644 --- a/pkg/api/passes.go +++ b/pkg/api/passes.go @@ -3,6 +3,7 @@ package api import ( "fmt" "regexp" + "sort" "strings" "unicode" ) @@ -302,7 +303,13 @@ loop: // renameExportable renames all operation names to be exportable names. // All nested Shape names are also updated to the exportable variant. func (a *API) renameExportable() { - for name, op := range a.Operations { + opNames := make([]string, 0, len(a.Operations)) + for name := range a.Operations { + opNames = append(opNames, name) + } + sort.Strings(opNames) + for _, name := range opNames { + op := a.Operations[name] newName := a.ExportableName(name) if newName != name { delete(a.Operations, name) @@ -311,7 +318,13 @@ func (a *API) renameExportable() { op.ExportedName = newName } - for k, s := range a.Shapes { + shapeKeys := make([]string, 0, len(a.Shapes)) + for k := range a.Shapes { + shapeKeys = append(shapeKeys, k) + } + sort.Strings(shapeKeys) + for _, k := range shapeKeys { + s := a.Shapes[k] // FIXME SNS has lower and uppercased shape names with the same name, // except the lowercased variant is used exclusively for string and // other primitive types. Renaming both would cause a collision. @@ -320,7 +333,13 @@ func (a *API) renameExportable() { continue } - for mName, member := range s.MemberRefs { + memberNames := make([]string, 0, len(s.MemberRefs)) + for mName := range s.MemberRefs { + memberNames = append(memberNames, mName) + } + sort.Strings(memberNames) + for _, mName := range memberNames { + member := s.MemberRefs[mName] newName := a.ExportableName(mName) if newName != mName { delete(s.MemberRefs, mName)