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).
This commit is contained in:
Yawning Angel 2019-06-07 07:26:47 +00:00
parent f46ed4aac8
commit 319ecb3005
2 changed files with 10 additions and 3 deletions

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)

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() {