Skip to content

Commit

Permalink
test: add more inactive filter tests to p2p_filter.py
Browse files Browse the repository at this point in the history
check the following expected behaviors if no filter is set:
-> filtered block requests are ignored by the node
-> sending a 'filteradd' message is treated as misbehavior
   (i.e. the peer's banscore increases by 100)

also fixes a bug in the on_inv() callback method, which
directly modified the type from BLOCK to FILTERED_BLOCK
in the received 'inv' message rather than just for the reply

Co-authored-by: MarcoFalke <[email protected]>
  • Loading branch information
theStack and MarcoFalke committed Apr 14, 2020
1 parent 5eae034 commit a9ecbdf
Showing 1 changed file with 22 additions and 4 deletions.
26 changes: 22 additions & 4 deletions test/functional/p2p_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,20 @@
"""

from test_framework.messages import (
CInv,
MSG_BLOCK,
MSG_FILTERED_BLOCK,
msg_getdata,
msg_filterload,
msg_filteradd,
msg_filterclear,
msg_filterload,
msg_getdata,
)
from test_framework.mininode import (
P2PInterface,
mininode_lock,
)
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import assert_equal


class FilterNode(P2PInterface):
Expand All @@ -38,8 +40,9 @@ def on_inv(self, message):
for i in message.inv:
# inv messages can only contain TX or BLOCK, so translate BLOCK to FILTERED_BLOCK
if i.type == MSG_BLOCK:
i.type = MSG_FILTERED_BLOCK
want.inv.append(i)
want.inv.append(CInv(MSG_FILTERED_BLOCK, i.hash))
else:
want.inv.append(i)
if len(want.inv):
self.send_message(want)

Expand Down Expand Up @@ -104,6 +107,21 @@ def run_test(self):
txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 7)
filter_node.wait_for_tx(txid)

self.log.info('Check that request for filtered blocks is ignored if no filter is set')
filter_node.merkleblock_received = False
filter_node.tx_received = False
with self.nodes[0].assert_debug_log(expected_msgs=['received getdata']):
block_hash = self.nodes[0].generatetoaddress(1, self.nodes[0].getnewaddress())[0]
filter_node.wait_for_inv([CInv(MSG_BLOCK, int(block_hash, 16))])
filter_node.sync_with_ping()
assert not filter_node.merkleblock_received
assert not filter_node.tx_received

self.log.info('Check that sending "filteradd" if no filter is set is treated as misbehavior (+100)')
assert_equal(self.nodes[0].getpeerinfo()[0]['banscore'], 0)
filter_node.send_and_ping(msg_filteradd(data=b'letsmisbehave'))
assert_equal(self.nodes[0].getpeerinfo()[0]['banscore'], 100)

self.log.info("Check that division-by-zero remote crash bug [CVE-2013-5700] is fixed")
filter_node.send_and_ping(msg_filterload(data=b'', nHashFuncs=1))
filter_node.send_and_ping(msg_filteradd(data=b'letstrytocrashthisnode'))
Expand Down

0 comments on commit a9ecbdf

Please sign in to comment.