common: fix BitArray.Update to avoid nil dereference
Update previously only checked that the receiver was
non-nil but didn't check that the input parameter to update
"o" was non-nil causing a nil dereference in cases such as
fe632ea32a/consensus/reactor.go (L306)
Fixes https://github.com/tendermint/tendermint/issues/1169
This commit is contained in:
parent
fa8c374aff
commit
84afef20f5
|
@ -306,7 +306,7 @@ func (bA *BitArray) Bytes() []byte {
|
||||||
// so if necessary, caller must copy or lock o prior to calling Update.
|
// so if necessary, caller must copy or lock o prior to calling Update.
|
||||||
// If bA is nil, does nothing.
|
// If bA is nil, does nothing.
|
||||||
func (bA *BitArray) Update(o *BitArray) {
|
func (bA *BitArray) Update(o *BitArray) {
|
||||||
if bA == nil {
|
if bA == nil || o == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
bA.mtx.Lock()
|
bA.mtx.Lock()
|
||||||
|
|
|
@ -164,3 +164,26 @@ func TestEmptyFull(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUpdateNeverPanics(t *testing.T) {
|
||||||
|
newRandBitArray := func(n int) *BitArray {
|
||||||
|
ba, _ := randBitArray(n)
|
||||||
|
return ba
|
||||||
|
}
|
||||||
|
pairs := []struct {
|
||||||
|
a, b *BitArray
|
||||||
|
}{
|
||||||
|
{nil, nil},
|
||||||
|
{newRandBitArray(10), newRandBitArray(12)},
|
||||||
|
{newRandBitArray(0), NewBitArray(10)},
|
||||||
|
{nil, NewBitArray(10)},
|
||||||
|
{nil, newRandBitArray(64)},
|
||||||
|
{newRandBitArray(63), newRandBitArray(64)},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pair := range pairs {
|
||||||
|
a, b := pair.a, pair.b
|
||||||
|
a.Update(b)
|
||||||
|
b.Update(a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue