|
4 | 4 | # file COPYING or http://www.opensource.org/licenses/mit-license.php. |
5 | 5 | """Test node responses to invalid network messages.""" |
6 | 6 |
|
| 7 | +import random |
| 8 | + |
7 | 9 |
|
8 | 10 | from test_framework.messages import ( |
9 | 11 | CBlockHeader, |
@@ -61,7 +63,7 @@ def run_test(self): |
61 | 63 | self.test_oversized_inv_msg() |
62 | 64 | self.test_oversized_getdata_msg() |
63 | 65 | self.test_oversized_headers_msg() |
64 | | - self.test_resource_exhaustion() |
| 66 | + self.test_noncontinuous_headers_msg() |
65 | 67 |
|
66 | 68 | def test_buffer(self): |
67 | 69 | self.log.info("Test message with header split across two buffers is received") |
@@ -186,6 +188,25 @@ def test_oversized_headers2_msg(self): |
186 | 188 | size = MAX_HEADERS_COMPRESSED_RESULT + 1 |
187 | 189 | self.test_oversized_msg(msg_headers2([CBlockHeader()] * size), size) |
188 | 190 |
|
| 191 | + def test_noncontinuous_headers_msg(self): |
| 192 | + self.log.info("Test headers message with non-continuous headers sequence is logged as misbehaving") |
| 193 | + block_hashes = self.generate(self.nodes[0], 10) |
| 194 | + block_headers = [] |
| 195 | + for block_hash in block_hashes: |
| 196 | + block_headers.append(from_hex(CBlockHeader(), self.nodes[0].getblockheader(block_hash, False))) |
| 197 | + |
| 198 | + # continuous headers sequence should be fine |
| 199 | + MISBEHAVING_NONCONTINUOUS_HEADERS_MSGS = ['Misbehaving', 'non-continuous headers sequence'] |
| 200 | + peer = self.nodes[0].add_p2p_connection(P2PInterface()) |
| 201 | + with self.nodes[0].assert_debug_log([], unexpected_msgs=MISBEHAVING_NONCONTINUOUS_HEADERS_MSGS): |
| 202 | + peer.send_and_ping(msg_headers(block_headers)) |
| 203 | + |
| 204 | + # delete arbitrary block header somewhere in the middle to break link |
| 205 | + del block_headers[random.randrange(1, len(block_headers)-1)] |
| 206 | + with self.nodes[0].assert_debug_log(expected_msgs=MISBEHAVING_NONCONTINUOUS_HEADERS_MSGS): |
| 207 | + peer.send_and_ping(msg_headers(block_headers)) |
| 208 | + self.nodes[0].disconnect_p2ps() |
| 209 | + |
189 | 210 | def test_resource_exhaustion(self): |
190 | 211 | self.log.info("Test node stays up despite many large junk messages") |
191 | 212 | # Don't use v2 here - the non-optimised encryption would take too long to encrypt |
|
0 commit comments