core: copy storage item key in simple.GetStorageItems

Related to #1468, ported from #1475.

We should copy the key to avoid bytes substitution. Otherwise there's a
chance that at the end of dao.Store.Seek(...) execution some keys won't
be the same as the original keys found inside saveToMap function because
storage.Seek can guarantee that provided key and value are only valid
until the next `f` call.
This commit is contained in:
Anna Shaleva 2020-10-10 12:37:46 +03:00
parent 93df89da8f
commit 097ef2a731
2 changed files with 6 additions and 1 deletions

View file

@ -413,7 +413,10 @@ func (dao *Simple) GetStorageItemsWithPrefix(id int32, prefix []byte) (map[strin
}
// Cut prefix and hash.
siMap[string(k[len(lookupKey):])] = si
// Must copy here, #1468.
key := make([]byte, len(k[len(lookupKey):]))
copy(key, k[len(lookupKey):])
siMap[string(key)] = si
}
dao.Store.Seek(lookupKey, saveToMap)
if err != nil {

View file

@ -38,6 +38,8 @@ type (
Get([]byte) ([]byte, error)
Put(k, v []byte) error
PutBatch(Batch) error
// Seek can guarantee that provided key (k) and value (v) are the only valid until the next call to f.
// Key and value slices should not be modified.
Seek(k []byte, f func(k, v []byte))
Close() error
}