Skip to content

Commit 764d30f

Browse files
committed
fix: concurrent map writes when calling GetSigners
1 parent 683371f commit 764d30f

2 files changed

Lines changed: 12 additions & 1 deletion

File tree

simapp/app.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,11 @@ func NewSimApp(
603603
}
604604
}
605605

606+
// validate SigningContext to pre-fill internal signers funcs map
607+
if err = app.interfaceRegistry.SigningContext().Validate(); err != nil {
608+
panic(err)
609+
}
610+
606611
return app
607612
}
608613

x/tx/signing/context.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package signing
33
import (
44
"errors"
55
"fmt"
6+
"sync"
67

78
cosmos_proto "github.com/cosmos/cosmos-proto"
89
gogoproto "github.com/cosmos/gogoproto/proto"
@@ -29,9 +30,11 @@ type Context struct {
2930
typeResolver protoregistry.MessageTypeResolver
3031
addressCodec address.Codec
3132
validatorAddressCodec address.Codec
32-
getSignersFuncs map[protoreflect.FullName]GetSignersFunc
3333
customGetSignerFuncs map[protoreflect.FullName]GetSignersFunc
3434
maxRecursionDepth int
35+
36+
mtx sync.Mutex
37+
getSignersFuncs map[protoreflect.FullName]GetSignersFunc
3538
}
3639

3740
// Options are options for creating Context which will be used for signing operations.
@@ -110,6 +113,7 @@ func NewContext(options Options) (*Context, error) {
110113
typeResolver: protoTypes,
111114
addressCodec: options.AddressCodec,
112115
validatorAddressCodec: options.ValidatorAddressCodec,
116+
mtx: sync.Mutex{},
113117
getSignersFuncs: map[protoreflect.FullName]GetSignersFunc{},
114118
customGetSignerFuncs: customGetSignerFuncs,
115119
maxRecursionDepth: options.MaxRecursionDepth,
@@ -336,6 +340,8 @@ func (c *Context) getGetSignersFn(messageDescriptor protoreflect.MessageDescript
336340
}
337341
f, ok = c.getSignersFuncs[messageDescriptor.FullName()]
338342
if !ok {
343+
c.mtx.Lock()
344+
defer c.mtx.Unlock()
339345
var err error
340346
f, err = c.makeGetSignersFunc(messageDescriptor)
341347
if err != nil {

0 commit comments

Comments
 (0)