From 6b994b2b71e290d8edc658a5e35c5f31c03f3e51 Mon Sep 17 00:00:00 2001 From: clemahieu Date: Sun, 18 Apr 2021 13:18:09 +0200 Subject: [PATCH] Fixing static initialization order on Windows using construct-on-first-use. (#3206) Fix discarded out of bounds memory access. --- nano/core_test/prioritization.cpp | 134 +++++++++++++++++++----------- nano/node/prioritization.cpp | 1 - 2 files changed, 87 insertions(+), 48 deletions(-) diff --git a/nano/core_test/prioritization.cpp b/nano/core_test/prioritization.cpp index 7decb83846..b3879f52aa 100644 --- a/nano/core_test/prioritization.cpp +++ b/nano/core_test/prioritization.cpp @@ -5,16 +5,56 @@ #include -static nano::keypair keyzero; -static nano::keypair key0; -static nano::keypair key1; -static nano::keypair key2; -static nano::keypair key3; -static auto blockzero = std::make_shared (keyzero.pub, 0, keyzero.pub, 0, 0, keyzero.prv, keyzero.pub, 0); -static auto block0 = std::make_shared (key0.pub, 0, key0.pub, nano::Gxrb_ratio, 0, key0.prv, key0.pub, 0); -static auto block1 = std::make_shared (key1.pub, 0, key1.pub, nano::Mxrb_ratio, 0, key1.prv, key1.pub, 0); -static auto block2 = std::make_shared (key2.pub, 0, key2.pub, nano::Gxrb_ratio, 0, key2.prv, key2.pub, 0); -static auto block3 = std::make_shared (key3.pub, 0, key3.pub, nano::Mxrb_ratio, 0, key3.prv, key3.pub, 0); +nano::keypair & keyzero () +{ + static nano::keypair result; + return result; +} +nano::keypair & key0 () +{ + static nano::keypair result; + return result; +} +nano::keypair & key1 () +{ + static nano::keypair result; + return result; +} +nano::keypair & key2 () +{ + static nano::keypair result; + return result; +} +nano::keypair & key3 () +{ + static nano::keypair result; + return result; +} +std::shared_ptr & blockzero () +{ + static std::shared_ptr result = std::make_shared (keyzero ().pub, 0, keyzero ().pub, 0, 0, keyzero ().prv, keyzero ().pub, 0); + return result; +} +std::shared_ptr & block0 () +{ + static std::shared_ptr result = std::make_shared (key0 ().pub, 0, key0 ().pub, nano::Gxrb_ratio, 0, key0 ().prv, key0 ().pub, 0); + return result; +} +std::shared_ptr & block1 () +{ + static std::shared_ptr result = std::make_shared (key1 ().pub, 0, key1 ().pub, nano::Mxrb_ratio, 0, key1 ().prv, key1 ().pub, 0); + return result; +} +std::shared_ptr & block2 () +{ + static std::shared_ptr result = std::make_shared (key2 ().pub, 0, key2 ().pub, nano::Gxrb_ratio, 0, key2 ().prv, key2 ().pub, 0); + return result; +} +std::shared_ptr & block3 () +{ + static std::shared_ptr result = std::make_shared (key3 ().pub, 0, key3 ().pub, nano::Mxrb_ratio, 0, key3 ().prv, key3 ().pub, 0); + return result; +} TEST (prioritization, construction) { @@ -27,7 +67,7 @@ TEST (prioritization, construction) TEST (prioritization, insert_zero) { nano::prioritization prioritization; - prioritization.push (1000, block0); + prioritization.push (1000, block0 ()); ASSERT_EQ (1, prioritization.size ()); ASSERT_EQ (1, prioritization.bucket_size (110)); } @@ -35,7 +75,7 @@ TEST (prioritization, insert_zero) TEST (prioritization, insert_one) { nano::prioritization prioritization; - prioritization.push (1000, block1); + prioritization.push (1000, block1 ()); ASSERT_EQ (1, prioritization.size ()); ASSERT_EQ (1, prioritization.bucket_size (100)); } @@ -43,8 +83,8 @@ TEST (prioritization, insert_one) TEST (prioritization, insert_same_priority) { nano::prioritization prioritization; - prioritization.push (1000, block0); - prioritization.push (1000, block2); + prioritization.push (1000, block0 ()); + prioritization.push (1000, block2 ()); ASSERT_EQ (2, prioritization.size ()); ASSERT_EQ (2, prioritization.bucket_size (110)); } @@ -52,8 +92,8 @@ TEST (prioritization, insert_same_priority) TEST (prioritization, insert_duplicate) { nano::prioritization prioritization; - prioritization.push (1000, block0); - prioritization.push (1000, block0); + prioritization.push (1000, block0 ()); + prioritization.push (1000, block0 ()); ASSERT_EQ (1, prioritization.size ()); ASSERT_EQ (1, prioritization.bucket_size (110)); } @@ -61,11 +101,11 @@ TEST (prioritization, insert_duplicate) TEST (prioritization, insert_older) { nano::prioritization prioritization; - prioritization.push (1000, block0); - prioritization.push (1100, block2); - ASSERT_EQ (block0, prioritization.top ()); + prioritization.push (1000, block0 ()); + prioritization.push (1100, block2 ()); + ASSERT_EQ (block0 (), prioritization.top ()); prioritization.pop (); - ASSERT_EQ (block2, prioritization.top ()); + ASSERT_EQ (block2 (), prioritization.top ()); prioritization.pop (); } @@ -73,7 +113,7 @@ TEST (prioritization, pop) { nano::prioritization prioritization; ASSERT_TRUE (prioritization.empty ()); - prioritization.push (1000, block0); + prioritization.push (1000, block0 ()); ASSERT_FALSE (prioritization.empty ()); prioritization.pop (); ASSERT_TRUE (prioritization.empty ()); @@ -82,18 +122,18 @@ TEST (prioritization, pop) TEST (prioritization, top_one) { nano::prioritization prioritization; - prioritization.push (1000, block0); - ASSERT_EQ (block0, prioritization.top ()); + prioritization.push (1000, block0 ()); + ASSERT_EQ (block0 (), prioritization.top ()); } TEST (prioritization, top_two) { nano::prioritization prioritization; - prioritization.push (1000, block0); - prioritization.push (1, block1); - ASSERT_EQ (block0, prioritization.top ()); + prioritization.push (1000, block0 ()); + prioritization.push (1, block1 ()); + ASSERT_EQ (block0 (), prioritization.top ()); prioritization.pop (); - ASSERT_EQ (block1, prioritization.top ()); + ASSERT_EQ (block1 (), prioritization.top ()); prioritization.pop (); ASSERT_TRUE (prioritization.empty ()); } @@ -101,17 +141,17 @@ TEST (prioritization, top_two) TEST (prioritization, top_round_robin) { nano::prioritization prioritization; - prioritization.push (1000, blockzero); - ASSERT_EQ (blockzero, prioritization.top ()); - prioritization.push (1000, block0); - prioritization.push (1000, block1); - prioritization.push (1100, block3); + prioritization.push (1000, blockzero ()); + ASSERT_EQ (blockzero (), prioritization.top ()); + prioritization.push (1000, block0 ()); + prioritization.push (1000, block1 ()); + prioritization.push (1100, block3 ()); prioritization.pop (); // blockzero - EXPECT_EQ (block1, prioritization.top ()); + EXPECT_EQ (block1 (), prioritization.top ()); prioritization.pop (); - EXPECT_EQ (block0, prioritization.top ()); + EXPECT_EQ (block0 (), prioritization.top ()); prioritization.pop (); - EXPECT_EQ (block3, prioritization.top ()); + EXPECT_EQ (block3 (), prioritization.top ()); prioritization.pop (); EXPECT_TRUE (prioritization.empty ()); } @@ -119,31 +159,31 @@ TEST (prioritization, top_round_robin) TEST (prioritization, trim_normal) { nano::prioritization prioritization{ 1 }; - prioritization.push (1000, block0); - prioritization.push (1100, block2); + prioritization.push (1000, block0 ()); + prioritization.push (1100, block2 ()); ASSERT_EQ (1, prioritization.size ()); - ASSERT_EQ (block0, prioritization.top ()); + ASSERT_EQ (block0 (), prioritization.top ()); } TEST (prioritization, trim_reverse) { nano::prioritization prioritization{ 1 }; - prioritization.push (1100, block2); - prioritization.push (1000, block0); + prioritization.push (1100, block2 ()); + prioritization.push (1000, block0 ()); ASSERT_EQ (1, prioritization.size ()); - ASSERT_EQ (block0, prioritization.top ()); + ASSERT_EQ (block0 (), prioritization.top ()); } TEST (prioritization, trim_even) { nano::prioritization prioritization{ 2 }; - prioritization.push (1000, block0); - prioritization.push (1100, block2); + prioritization.push (1000, block0 ()); + prioritization.push (1100, block2 ()); ASSERT_EQ (1, prioritization.size ()); - ASSERT_EQ (block0, prioritization.top ()); - prioritization.push (1000, block1); + ASSERT_EQ (block0 (), prioritization.top ()); + prioritization.push (1000, block1 ()); ASSERT_EQ (2, prioritization.size ()); - ASSERT_EQ (block0, prioritization.top ()); + ASSERT_EQ (block0 (), prioritization.top ()); prioritization.pop (); - ASSERT_EQ (block1, prioritization.top ()); + ASSERT_EQ (block1 (), prioritization.top ()); } diff --git a/nano/node/prioritization.cpp b/nano/node/prioritization.cpp index 64771f34a5..7c73f3ba55 100644 --- a/nano/node/prioritization.cpp +++ b/nano/node/prioritization.cpp @@ -46,7 +46,6 @@ maximum{ maximum } { static size_t constexpr bucket_count = 129; buckets.resize (bucket_count); - (void)minimums[0]; nano::uint128_t minimum{ 1 }; minimums.push_back (0); for (auto i = 1; i < bucket_count; ++i)