diff --git a/src/net_processing.cpp b/src/net_processing.cpp --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -3399,11 +3399,15 @@ if (memcmp(hash.begin(), hdr.pchChecksum, CMessageHeader::CHECKSUM_SIZE) != 0) { LogPrint( - BCLog::NET, "%s(%s, %u bytes): CHECKSUM ERROR expected %s was %s\n", + BCLog::NET, + "%s(%s, %u bytes): CHECKSUM ERROR expected %s was %s from " + "peer=%d\n", __func__, SanitizeString(strCommand), nMessageSize, HexStr(hash.begin(), hash.begin() + CMessageHeader::CHECKSUM_SIZE), HexStr(hdr.pchChecksum, - hdr.pchChecksum + CMessageHeader::CHECKSUM_SIZE)); + hdr.pchChecksum + CMessageHeader::CHECKSUM_SIZE), + pfrom->GetId()); + connman->Ban(pfrom->addr, BanReasonNodeMisbehaving); return fMoreWork; } diff --git a/test/functional/abc-invalid-message.py b/test/functional/abc-invalid-message.py new file mode 100755 --- /dev/null +++ b/test/functional/abc-invalid-message.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +# Copyright (c) 2019 The Bitcoin developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +"""ABC Invalid Message Test + +Test that invalid messages get rejected and/or ban the sender as expected for +each case. +""" + +import struct +from test_framework.mininode import ( + P2PInterface, + msg_ping, + mininode_lock, + MAGIC_BYTES, + network_thread_start, +) +from test_framework.test_framework import BitcoinTestFramework +from test_framework.messages import NODE_NETWORK, msg_version +from test_framework.util import wait_until + + +def msg_bad_checksum(connection, original_message): + message_data = bytearray(connection.format_message(original_message)) + + data = original_message.serialize() + i = 0 + i += len(MAGIC_BYTES[connection.network]) + i += 12 + i += len(struct.pack("