From 0b6833c3336d6b8d6acc010e4082c94d25135adb Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 3 Mar 2021 16:52:38 +0100 Subject: [PATCH] Lock mutex on getting element from cache (#8767) --- types/address.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/types/address.go b/types/address.go index d96c2f3247..c6f6404e87 100644 --- a/types/address.go +++ b/types/address.go @@ -268,11 +268,12 @@ func (aa AccAddress) String() string { } var key = conv.UnsafeBytesToStr(aa) + accAddrMu.Lock() + defer accAddrMu.Unlock() if addr, ok := accAddrCache.Get(key); ok { return addr.(string) } - return cacheBech32Addr(GetConfig().GetBech32AccountAddrPrefix(), - aa, &accAddrMu, accAddrCache, key) + return cacheBech32Addr(GetConfig().GetBech32AccountAddrPrefix(), aa, accAddrCache, key) } // Format implements the fmt.Formatter interface. @@ -416,11 +417,12 @@ func (va ValAddress) String() string { } var key = conv.UnsafeBytesToStr(va) + valAddrMu.Lock() + defer valAddrMu.Unlock() if addr, ok := valAddrCache.Get(key); ok { return addr.(string) } - return cacheBech32Addr(GetConfig().GetBech32ValidatorAddrPrefix(), - va, &valAddrMu, valAddrCache, key) + return cacheBech32Addr(GetConfig().GetBech32ValidatorAddrPrefix(), va, valAddrCache, key) } // Format implements the fmt.Formatter interface. @@ -569,11 +571,12 @@ func (ca ConsAddress) String() string { } var key = conv.UnsafeBytesToStr(ca) + consAddrMu.Lock() + defer consAddrMu.Unlock() if addr, ok := consAddrCache.Get(key); ok { return addr.(string) } - return cacheBech32Addr(GetConfig().GetBech32ConsensusAddrPrefix(), - ca, &consAddrMu, consAddrCache, key) + return cacheBech32Addr(GetConfig().GetBech32ConsensusAddrPrefix(), ca, consAddrCache, key) } // Bech32ifyAddressBytes returns a bech32 representation of address bytes. @@ -719,13 +722,11 @@ func addressBytesFromHexString(address string) ([]byte, error) { return hex.DecodeString(address) } -func cacheBech32Addr(prefix string, addr []byte, m sync.Locker, cache *simplelru.LRU, cacheKey string) string { +func cacheBech32Addr(prefix string, addr []byte, cache *simplelru.LRU, cacheKey string) string { bech32Addr, err := bech32.ConvertAndEncode(prefix, addr) if err != nil { panic(err) } - m.Lock() cache.Add(cacheKey, bech32Addr) - m.Unlock() return bech32Addr }