aboutsummaryrefslogtreecommitdiffstats
path: root/trie
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2016-10-15 06:40:32 +0800
committerFelix Lange <fjl@twurst.com>2016-10-15 06:42:52 +0800
commit2cd7a0395dd8813867884bced1b01663165ea1d4 (patch)
treefb1d5bab651dab23e6280327ff22f8c2094a65b2 /trie
parent81b01f1c2bba8340f9cf2bf1da8ef131e3decd50 (diff)
downloaddexon-2cd7a0395dd8813867884bced1b01663165ea1d4.tar.gz
dexon-2cd7a0395dd8813867884bced1b01663165ea1d4.tar.zst
dexon-2cd7a0395dd8813867884bced1b01663165ea1d4.zip
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.
Diffstat (limited to 'trie')
-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{