Skip to content

Commit

Permalink
blockcache: fix heap escape in GetBlock
Browse files Browse the repository at this point in the history
This commit fixes a heap escape found in `GetBlock`. This happens
because the `msgBlock` is a pointer returned from `getBlockImpl`, and
the whole `getBlockImpl` escapes to the heap because it's referenced in
two places,
- in the `Cache`, it's used as a reference type to create the new block.
- this pointer is also returned and now needs to stay on the heap.

The fix is simple, we now make a copy of the block and use the copy
instead, freeing `getBlockImpl` from the heap.
  • Loading branch information
yyforyongyu committed Jan 23, 2024
1 parent 77e5dea commit 4ee862e
Showing 1 changed file with 7 additions and 3 deletions.
10 changes: 7 additions & 3 deletions blockcache/blockcache.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,22 +52,26 @@ func (bc *BlockCache) GetBlock(hash *chainhash.Hash,
}

// Fetch the block from the chain backends.
block, err := getBlockImpl(hash)
msgBlock, err := getBlockImpl(hash)
if err != nil {
return nil, err
}

// Make a copy of the block so it won't escape to the heap.
msgBlockCopy := msgBlock.Copy()
block := btcutil.NewBlock(msgBlockCopy)

// Add the new block to blockCache. If the Cache is at its maximum
// capacity then the LFU item will be evicted in favour of this new
// block.
_, err = bc.Cache.Put(
*inv, &neutrino.CacheableBlock{
Block: btcutil.NewBlock(block),
Block: block,
},
)
if err != nil {
return nil, err
}

return block, nil
return msgBlockCopy, nil
}

0 comments on commit 4ee862e

Please sign in to comment.