Skip to content

Commit

Permalink
Problem: memiavl's root hash is not safe to retain in commit info
Browse files Browse the repository at this point in the history
Solution:
- clone the byte slices when nesserary
  • Loading branch information
yihuang committed Sep 1, 2023
1 parent 265459d commit 9ac8b24
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
- [#1123](https://github.com/crypto-org-chain/cronos/pull/1123) Fix memiavl snapshot switching
- [#1125](https://github.com/crypto-org-chain/cronos/pull/1125) Fix genesis migrate for feeibc, evm, feemarket and gravity.
- [#1130](https://github.com/crypto-org-chain/cronos/pull/1130) Fix lock issues when state-sync with memiavl.
- [#]() Fix memiavl's unsafe retain of the root hashes.

### Features

Expand Down
4 changes: 4 additions & 0 deletions memiavl/mem_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ func (node *MemNode) Mutate(version, cowVersion uint32) *MemNode {
return n
}

func (node *MemNode) SafeHash() []byte {
return node.Hash()
}

// Computes the hash of the node without computing its descendants. Must be
// called on nodes which have descendant node hashes already computed.
func (node *MemNode) Hash() []byte {
Expand Down
3 changes: 3 additions & 0 deletions memiavl/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ type Node interface {
Right() Node
Hash() []byte

// SafeHash returns byte slice that's safe to retain
SafeHash() []byte

// PersistedNode clone a new node, MemNode modify in place
Mutate(version, cowVersion uint32) *MemNode

Expand Down
4 changes: 4 additions & 0 deletions memiavl/persisted_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@ func (node PersistedNode) Right() Node {
return PersistedNode{snapshot: node.snapshot, index: node.index - 1}
}

func (node PersistedNode) SafeHash() []byte {
return bytes.Clone(node.Hash())
}

func (node PersistedNode) Hash() []byte {
if node.isLeaf {
return node.leafNode().Hash()
Expand Down
5 changes: 3 additions & 2 deletions memiavl/tree.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,12 +162,13 @@ func (t *Tree) Version() int64 {
return int64(t.version)
}

// RootHash updates the hashes and return the current root hash
// RootHash updates the hashes and return the current root hash,
// it clones the persisted node's bytes, so the returned bytes is safe to retain.
func (t *Tree) RootHash() []byte {
if t.root == nil {
return emptyHash
}
return t.root.Hash()
return t.root.SafeHash()
}

func (t *Tree) GetWithIndex(key []byte) (int64, []byte) {
Expand Down

0 comments on commit 9ac8b24

Please sign in to comment.