Browse Source

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
pull/1842/head
Emmanuel Odeke 7 years ago
parent
commit
84afef20f5
No known key found for this signature in database GPG Key ID: 1CA47A292F89DD40
2 changed files with 24 additions and 1 deletions
  1. +1
    -1
      common/bit_array.go
  2. +23
    -0
      common/bit_array_test.go

+ 1
- 1
common/bit_array.go View File

@ -306,7 +306,7 @@ func (bA *BitArray) Bytes() []byte {
// so if necessary, caller must copy or lock o prior to calling Update.
// If bA is nil, does nothing.
func (bA *BitArray) Update(o *BitArray) {
if bA == nil {
if bA == nil || o == nil {
return
}
bA.mtx.Lock()


+ 23
- 0
common/bit_array_test.go View File

@ -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…
Cancel
Save