aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2016-10-15 06:40:32 +0800
committerPéter Szilágyi <peterke@gmail.com>2016-10-15 16:00:53 +0800
commit18c8ded42c76e2fd07531bb7cb30ca75b0f9fe5f (patch)
treeb249fbb31c04b03c7bc4fdeb2861d64ae7759210
parent00ba7487079e42b4f73d084f3b13621332b40725 (diff)
downloadgo-tangerine-18c8ded42c76e2fd07531bb7cb30ca75b0f9fe5f.tar
go-tangerine-18c8ded42c76e2fd07531bb7cb30ca75b0f9fe5f.tar.gz
go-tangerine-18c8ded42c76e2fd07531bb7cb30ca75b0f9fe5f.tar.bz2
go-tangerine-18c8ded42c76e2fd07531bb7cb30ca75b0f9fe5f.tar.lz
go-tangerine-18c8ded42c76e2fd07531bb7cb30ca75b0f9fe5f.tar.xz
go-tangerine-18c8ded42c76e2fd07531bb7cb30ca75b0f9fe5f.tar.zst
go-tangerine-18c8ded42c76e2fd07531bb7cb30ca75b0f9fe5f.zip
[release/1.4.18] trie: fix regression that linked all downloaded nodes together
The trie sync code links subtries using pointers into node structs. Since commit 40cdcf1183 nodes are no longer copied when unpacking from an interface value, causing all nodes to get linked up as the sync progresses. Fix it by breaking the pointer chain with an explicit copy. (cherry picked from commit 2cd7a0395dd8813867884bced1b01663165ea1d4)
-rw-r--r--trie/sync.go2
1 files changed, 2 insertions, 0 deletions
diff --git a/trie/sync.go b/trie/sync.go
index 3de758536..400dff903 100644
--- a/trie/sync.go
+++ b/trie/sync.go
@@ -213,11 +213,13 @@ func (s *TrieSync) children(req *request) ([]*request, error) {
switch node := (*req.object).(type) {
case *shortNode:
+ node = node.copy() // Prevents linking all downloaded nodes together.
children = []child{{
node: &node.Val,
depth: req.depth + len(node.Key),
}}
case *fullNode:
+ node = node.copy()
for i := 0; i < 17; i++ {
if node.Children[i] != nil {
children = append(children, child{