From 2b259639d2204b08bc9654412458ebbb70440eaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Tue, 14 May 2019 19:06:25 +0200 Subject: [PATCH] peer discovery: fix occasional use-after-free in unit test --- tests/peerdiscoverytester.cpp | 85 ++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/tests/peerdiscoverytester.cpp b/tests/peerdiscoverytester.cpp index 61ed48b9..d3de9478 100644 --- a/tests/peerdiscoverytester.cpp +++ b/tests/peerdiscoverytester.cpp @@ -57,53 +57,54 @@ void PeerDiscoveryTester::testTransmission() pdd.cha = 'a'; pdd.str = "apple"; - dht::PeerDiscovery test_n(MULTICAST_PORT); - dht::PeerDiscovery test_s(MULTICAST_PORT); - std::mutex lock; std::condition_variable cv; - std::unique_lock<std::mutex> l(lock); unsigned count_node {0}; unsigned count_test {0}; - test_s.startDiscovery<NodeInsertion>(type,[&](NodeInsertion&& v, dht::SockAddr&& add){ - CPPUNIT_ASSERT_EQUAL(v.node_port, adc.node_port); - CPPUNIT_ASSERT_EQUAL(v.nodeid, adc.nodeid); - CPPUNIT_ASSERT_EQUAL(v.nid, adc.nid); - { - std::lock_guard<std::mutex> l(lock); - count_node++; - } - cv.notify_all(); - }); - - test_s.startDiscovery(test_type,[&](msgpack::object&& obj, dht::SockAddr&& add){ - auto v = obj.as<TestPack>(); - CPPUNIT_ASSERT_EQUAL(v.num, pdd.num); - CPPUNIT_ASSERT_EQUAL(v.cha, pdd.cha); - CPPUNIT_ASSERT_EQUAL(v.str, pdd.str); - { - std::lock_guard<std::mutex> l(lock); - count_test++; - } - cv.notify_all(); - }); - - test_n.startPublish(type, adc); - CPPUNIT_ASSERT(cv.wait_for(l, std::chrono::seconds(5), [&]{ - return count_node > 0; - })); - - test_n.startPublish(test_type, pdd); - CPPUNIT_ASSERT(cv.wait_for(l, std::chrono::seconds(5), [&]{ - return count_node > 1 and count_test > 0; - })); - l.unlock(); - - test_n.stopPublish(type); - test_n.stopPublish(test_type); - test_n.stopDiscovery(type); - test_n.stopDiscovery(test_type); + { + std::unique_lock<std::mutex> l(lock); + dht::PeerDiscovery test_n(MULTICAST_PORT); + dht::PeerDiscovery test_s(MULTICAST_PORT); + + test_s.startDiscovery<NodeInsertion>(type,[&](NodeInsertion&& v, dht::SockAddr&& add){ + CPPUNIT_ASSERT_EQUAL(adc.node_port, v.node_port); + CPPUNIT_ASSERT_EQUAL(adc.nodeid, v.nodeid); + CPPUNIT_ASSERT_EQUAL(adc.nid, v.nid); + { + std::lock_guard<std::mutex> l(lock); + count_node++; + } + cv.notify_all(); + }); + + test_s.startDiscovery(test_type,[&](msgpack::object&& obj, dht::SockAddr&& add){ + auto v = obj.as<TestPack>(); + CPPUNIT_ASSERT_EQUAL(pdd.num, v.num); + CPPUNIT_ASSERT_EQUAL(pdd.cha, v.cha); + CPPUNIT_ASSERT_EQUAL(pdd.str, v.str); + { + std::lock_guard<std::mutex> l(lock); + count_test++; + } + cv.notify_all(); + }); + + test_n.startPublish(type, adc); + CPPUNIT_ASSERT(cv.wait_for(l, std::chrono::seconds(5), [&]{ + return count_node > 0; + })); + + test_n.startPublish(test_type, pdd); + CPPUNIT_ASSERT(cv.wait_for(l, std::chrono::seconds(5), [&]{ + return count_node > 1 and count_test > 0; + })); + l.unlock(); + test_n.stopPublish(type); + test_n.stopPublish(test_type); + test_s.stopDiscovery(type); + test_s.stopDiscovery(test_type); + } } void PeerDiscoveryTester::tearDown(){} -- GitLab