From c17b695128177a6449cf938ec5b278d35aab66fb Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 9 Jan 2018 18:14:25 -0800 Subject: [PATCH] lnwallet/btcwallet/blockchain: properly handle nil spend report This commit adds an additional check in GetUtxo that tests for the nil-ness of the spend report returned by the neutrino backend. Previously, a nil error and spend report could be returned if the rescan did not find the output at or above the start height. This was observed to have cause a nil pointer dereference when the returning line attempted to access the output. This case is now handled by returning a distinct error signaling that the output was not found. --- lnwallet/btcwallet/blockchain.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lnwallet/btcwallet/blockchain.go b/lnwallet/btcwallet/blockchain.go index fed6c830..d930ac55 100644 --- a/lnwallet/btcwallet/blockchain.go +++ b/lnwallet/btcwallet/blockchain.go @@ -18,6 +18,10 @@ var ( // ErrOutputSpent is returned by the GetUtxo method if the target output // for lookup has already been spent. ErrOutputSpent = errors.New("target output has been spent") + + // ErrOutputNotFound signals that the desired output could not be + // located. + ErrOutputNotFound = errors.New("target output was not found") ) // GetBestBlock returns the current height and hash of the best known block @@ -61,10 +65,19 @@ func (b *BtcWallet) GetUtxo(op *wire.OutPoint, heightHint uint32) (*wire.TxOut, return nil, err } - if spendReport != nil && spendReport.SpendingTx != nil { + // If the spend report is nil, then the output was not found in + // the rescan. + if spendReport == nil { + return nil, ErrOutputNotFound + } + + // If the spending transaction is populated in the spend report, + // this signals that the output has already been spent. + if spendReport.SpendingTx != nil { return nil, ErrOutputSpent } + // Otherwise, the output is assumed to be in the UTXO. return spendReport.Output, nil case *chain.RPCClient: