From 7568f89c5559a667c53dfaa6d1bef27fe3b4ae86 Mon Sep 17 00:00:00 2001 From: Thomas Winget Date: Sat, 27 Sep 2014 17:46:12 -0400 Subject: [PATCH] Fixed segfault with checkpoints loading Bounds checking on blockchain_storage' m_blocks.size() when validating against checkpoints. Also moved initial json & DNS checkpoints load to after blockchain init. --- src/cryptonote_core/blockchain_storage.cpp | 6 ++++++ src/cryptonote_core/cryptonote_core.cpp | 4 ++++ src/daemon/daemon.cpp | 2 -- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/cryptonote_core/blockchain_storage.cpp b/src/cryptonote_core/blockchain_storage.cpp index 5dfda08ba..1165a9035 100644 --- a/src/cryptonote_core/blockchain_storage.cpp +++ b/src/cryptonote_core/blockchain_storage.cpp @@ -1793,6 +1793,12 @@ bool blockchain_storage::update_checkpoints(const std::string& file_path) for (const auto& pt : points) { + // if the checkpoint is for a block we don't have yet, move on + if (pt.first >= m_blocks.size()) + { + continue; + } + if (!m_checkpoints.check_block(pt.first, get_block_hash(m_blocks[pt.first].bl))) { // if we're enforcing dns checkpoints, roll back to a couple of blocks before the checkpoint diff --git a/src/cryptonote_core/cryptonote_core.cpp b/src/cryptonote_core/cryptonote_core.cpp index 1dbc7bf52..d14be252b 100644 --- a/src/cryptonote_core/cryptonote_core.cpp +++ b/src/cryptonote_core/cryptonote_core.cpp @@ -150,6 +150,10 @@ namespace cryptonote r = m_blockchain_storage.init(m_config_folder, testnet); CHECK_AND_ASSERT_MES(r, false, "Failed to initialize blockchain storage"); + // load json & DNS checkpoints, and verify them + // with respect to what blocks we already have + update_checkpoints(); + r = m_miner.init(vm, testnet); CHECK_AND_ASSERT_MES(r, false, "Failed to initialize blockchain storage"); diff --git a/src/daemon/daemon.cpp b/src/daemon/daemon.cpp index 8e915fb1d..da09acfd4 100644 --- a/src/daemon/daemon.cpp +++ b/src/daemon/daemon.cpp @@ -221,8 +221,6 @@ int main(int argc, char* argv[]) } else { ccore.set_checkpoints(std::move(checkpoints)); ccore.set_checkpoints_file_path(checkpoint_json_hashfile_fullpath.string()); - res = ccore.update_checkpoints(); - CHECK_AND_ASSERT_MES(res, 1, "Failed to load initial checkpoints"); } cryptonote::t_cryptonote_protocol_handler cprotocol(ccore, NULL);