From dbe2e04d62c672aef505dcde199672322716ce92 Mon Sep 17 00:00:00 2001 From: fanquake Date: Fri, 17 Mar 2023 14:43:06 +0000 Subject: [PATCH] Merge bitcoin/bitcoin#27212: test: Make the unlikely race in p2p_invalid_messages impossible fa1eb0ecaef14d428812f956082d29ab134fc728 test: Make the unlikely race in p2p_invalid_messages impossible (MarcoFalke) Pull request description: After `add_p2p_connection` both sides have the verack processed. However the pong from conn in reply to the ping from the node has not been processed and recorded in totalbytesrecv. Flush the pong from conn by sending a ping from conn. This should make the unlikely race impossible. ACKs for top commit: mzumsande: ACK fa1eb0ecaef14d428812f956082d29ab134fc728 pinheadmz: ACK fa1eb0ecaef14d428812f956082d29ab134fc728 Tree-SHA512: 44166587572e8c0c758cac460fcfd5cf403b2883880128b13dc62e7f74ca5cb8f145bb68a903df177ff0e62faa360f913fd409b009d4cd1360f1f4403ade39ae --- test/functional/p2p_invalid_messages.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/functional/p2p_invalid_messages.py b/test/functional/p2p_invalid_messages.py index 6d4495b471..84a6f3c346 100755 --- a/test/functional/p2p_invalid_messages.py +++ b/test/functional/p2p_invalid_messages.py @@ -66,6 +66,11 @@ class InvalidMessagesTest(BitcoinTestFramework): def test_buffer(self): self.log.info("Test message with header split across two buffers is received") conn = self.nodes[0].add_p2p_connection(P2PDataStore()) + # After add_p2p_connection both sides have the verack processed. + # However the pong from conn in reply to the ping from the node has not + # been processed and recorded in totalbytesrecv. + # Flush the pong from conn by sending a ping from conn. + conn.sync_with_ping(timeout=1) # Create valid message msg = conn.build_message(msg_ping(nonce=12345)) cut_pos = 12 # Chosen at an arbitrary position within the header @@ -75,8 +80,6 @@ class InvalidMessagesTest(BitcoinTestFramework): # Wait until node has processed the first half of the message self.wait_until(lambda: self.nodes[0].getnettotals()['totalbytesrecv'] != before) middle = self.nodes[0].getnettotals()['totalbytesrecv'] - # If this assert fails, we've hit an unlikely race - # where the test framework sent a message in between the two halves assert_equal(middle, before + cut_pos) conn.send_raw_message(msg[cut_pos:]) conn.sync_with_ping(timeout=1)