mirror of
https://github.com/tendermint/tendermint.git
synced 2026-10-01 04:05:45 +00:00
fix: avoid race with a deeper copy (#6285)
This commit is contained in:
+12
-6
@@ -422,21 +422,21 @@ func (bA *BitArray) UnmarshalJSON(bz []byte) error {
|
||||
|
||||
// ToProto converts BitArray to protobuf. It returns nil if BitArray is
|
||||
// nil/empty.
|
||||
//
|
||||
// XXX: It does not copy the array.
|
||||
func (bA *BitArray) ToProto() *tmprotobits.BitArray {
|
||||
if bA == nil ||
|
||||
(len(bA.Elems) == 0 && bA.Bits == 0) { // empty
|
||||
return nil
|
||||
}
|
||||
|
||||
return &tmprotobits.BitArray{Bits: int64(bA.Bits), Elems: bA.Elems}
|
||||
bA.mtx.Lock()
|
||||
defer bA.mtx.Unlock()
|
||||
|
||||
bc := bA.copy()
|
||||
return &tmprotobits.BitArray{Bits: int64(bc.Bits), Elems: bc.Elems}
|
||||
}
|
||||
|
||||
// FromProto sets BitArray to the given protoBitArray. It returns an error if
|
||||
// protoBitArray is invalid.
|
||||
//
|
||||
// XXX: It does not copy the array.
|
||||
func (bA *BitArray) FromProto(protoBitArray *tmprotobits.BitArray) error {
|
||||
if protoBitArray == nil {
|
||||
return nil
|
||||
@@ -454,8 +454,14 @@ func (bA *BitArray) FromProto(protoBitArray *tmprotobits.BitArray) error {
|
||||
return fmt.Errorf("invalid number of Elems: got %d, but exp %d", got, exp)
|
||||
}
|
||||
|
||||
bA.mtx.Lock()
|
||||
defer bA.mtx.Unlock()
|
||||
|
||||
ec := make([]uint64, len(protoBitArray.Elems))
|
||||
copy(ec, protoBitArray.Elems)
|
||||
|
||||
bA.Bits = int(protoBitArray.Bits)
|
||||
bA.Elems = protoBitArray.Elems
|
||||
bA.Elems = ec
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -299,7 +299,7 @@ func TestBitArrayFromProto(t *testing.T) {
|
||||
expErr bool
|
||||
}{
|
||||
0: {nil, &BitArray{}, false},
|
||||
1: {&tmprotobits.BitArray{}, &BitArray{}, false},
|
||||
1: {&tmprotobits.BitArray{}, &BitArray{Elems: []uint64{}}, false},
|
||||
|
||||
2: {&tmprotobits.BitArray{Bits: 1, Elems: make([]uint64, 1)}, &BitArray{Bits: 1, Elems: make([]uint64, 1)}, false},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user