From 4ee862e3bede9f5448dcc52abf8f09368e59dca4 Mon Sep 17 00:00:00 2001 From: yyforyongyu Date: Sun, 21 Jan 2024 18:51:22 +0800 Subject: [PATCH] blockcache: fix heap escape in `GetBlock` 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. --- blockcache/blockcache.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/blockcache/blockcache.go b/blockcache/blockcache.go index 09d5d3395..532629feb 100644 --- a/blockcache/blockcache.go +++ b/blockcache/blockcache.go @@ -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 }