Browse Source

libs/db: Fix the BoltDB Get and Iterator

BoltDB's accessors will return slices that are only valid for the
lifetime of the transaction.  This adds copies where required to prevent
hard to debug crashes (among other things).
pull/3720/head
Yawning Angel 6 years ago
parent
commit
319ecb3005
2 changed files with 10 additions and 3 deletions
  1. +1
    -0
      CHANGELOG_PENDING.md
  2. +9
    -3
      libs/db/boltdb.go

+ 1
- 0
CHANGELOG_PENDING.md View File

@ -29,3 +29,4 @@
### BUG FIXES:
- [libs/db] Fixed the BoltDB backend's Batch.Delete implementation (@Yawning)
- [libs/db] Fixed the BoltDB backend's Get and Iterator implementation (@Yawning)

+ 9
- 3
libs/db/boltdb.go View File

@ -66,7 +66,9 @@ func (bdb *BoltDB) Get(key []byte) (value []byte) {
key = nonEmptyKey(nonNilBytes(key))
err := bdb.db.View(func(tx *bbolt.Tx) error {
b := tx.Bucket(bucket)
value = b.Get(key)
if v := b.Get(key); v != nil {
value = append([]byte{}, v...)
}
return nil
})
if err != nil {
@ -312,12 +314,16 @@ func (itr *boltDBIterator) Next() {
func (itr *boltDBIterator) Key() []byte {
itr.assertIsValid()
return itr.currentKey
return append([]byte{}, itr.currentKey...)
}
func (itr *boltDBIterator) Value() []byte {
itr.assertIsValid()
return itr.currentValue
var value []byte
if itr.currentValue != nil {
value = append([]byte{}, itr.currentValue...)
}
return value
}
func (itr *boltDBIterator) Close() {


Loading…
Cancel
Save