From 0652ee73ec880a66ec88bde007ee03c0b9d1b074 Mon Sep 17 00:00:00 2001 From: Rob Fielding Date: Thu, 14 Oct 2021 17:32:05 +1300 Subject: [PATCH] Add size check on meta.key_origin.path Resolves segfault on legacy wallet Log warning when meta.key_origin.path is below expected size --- src/wallet/scriptpubkeyman.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/wallet/scriptpubkeyman.cpp b/src/wallet/scriptpubkeyman.cpp index 1769429efec..5a9755d32b8 100644 --- a/src/wallet/scriptpubkeyman.cpp +++ b/src/wallet/scriptpubkeyman.cpp @@ -382,11 +382,18 @@ std::vector LegacyScriptPubKeyMan::MarkUnusedAddresses(const if (it != mapKeyMetadata.end()){ CKeyMetadata meta = it->second; if (!meta.hd_seed_id.IsNull() && meta.hd_seed_id != m_hd_chain.seed_id) { - bool internal = (meta.key_origin.path[1] & ~BIP32_HARDENED_KEY_LIMIT) != 0; - int64_t index = meta.key_origin.path[2] & ~BIP32_HARDENED_KEY_LIMIT; + if (meta.key_origin.path.size() < 3) { + WalletLogPrintf("%s: Adding inactive seed keys failed, insufficient path size: %d, has_key_origin: %s\n", + __func__, + meta.key_origin.path.size(), + meta.has_key_origin); + } else { + bool internal = (meta.key_origin.path[1] & ~BIP32_HARDENED_KEY_LIMIT) != 0; + int64_t index = meta.key_origin.path[2] & ~BIP32_HARDENED_KEY_LIMIT; - if (!TopUpInactiveHDChain(meta.hd_seed_id, index, internal)) { - WalletLogPrintf("%s: Adding inactive seed keys failed\n", __func__); + if (!TopUpInactiveHDChain(meta.hd_seed_id, index, internal)) { + WalletLogPrintf("%s: Adding inactive seed keys failed\n", __func__); + } } } }