blockchain: ensure all blocks get their longhash precalculated

If the number of blocks to check was not a multiple of the
number of preparation threads, the last few blocks would
not be included in the threaded long hash calculation.
Those would still get calculated when the block gets added
to the chain, however, so this was only a tiny performance
hit, rather than a security bug.
This commit is contained in:
moneromooo-monero 2017-07-27 18:18:49 +01:00
parent ff4bcaed81
commit 91aa90fc79
No known key found for this signature in database
GPG Key ID: 686F07454D6CEFC3
2 changed files with 4 additions and 2 deletions

View File

@ -3743,9 +3743,11 @@ bool Blockchain::prepare_handle_incoming_blocks(const std::list<block_complete_e
if (!blocks_exist)
{
m_blocks_longhash_table.clear();
uint64_t thread_height = height;
for (uint64_t i = 0; i < threads; i++)
{
thread_list.push_back(new boost::thread(attrs, boost::bind(&Blockchain::block_longhash_worker, this, height + (i * batches), std::cref(blocks[i]), std::ref(maps[i]))));
thread_list.push_back(new boost::thread(attrs, boost::bind(&Blockchain::block_longhash_worker, this, thread_height, std::cref(blocks[i]), std::ref(maps[i]))));
thread_height += blocks[i].size();
}
for (size_t j = 0; j < thread_list.size(); j++)

View File

@ -846,7 +846,7 @@ namespace cryptonote
* @param blocks the blocks to be hashed
* @param map return-by-reference the hashes for each block
*/
void block_longhash_worker(const uint64_t height, const std::vector<block> &blocks,
void block_longhash_worker(uint64_t height, const std::vector<block> &blocks,
std::unordered_map<crypto::hash, crypto::hash> &map) const;
/**