From 78c423110318efebd420f3a2cb1ac10c3cf685f9 Mon Sep 17 00:00:00 2001 From: vlntb <13349202+vlntb@users.noreply.github.com> Date: Wed, 14 Aug 2024 23:04:03 +0100 Subject: [PATCH] Drop duplicate incoming TMLedgerData messages: * Addresses RIPD-1869 --------- Co-authored-by: Valentin Balaschenko <13349202+vlntb@users.noreply.github.com> Co-authored-by: Ed Hennis --- src/ripple/app/misc/HashRouter.h | 2 +- src/ripple/overlay/impl/PeerImp.cpp | 10 +++++++- src/ripple/overlay/impl/ProtocolMessage.h | 29 +++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/ripple/app/misc/HashRouter.h b/src/ripple/app/misc/HashRouter.h index abcd78ce0cd..f8452a17ccc 100644 --- a/src/ripple/app/misc/HashRouter.h +++ b/src/ripple/app/misc/HashRouter.h @@ -186,7 +186,7 @@ class HashRouter /** Add a suppression peer and get message's relay status. * Return pair: - * element 1: true if the peer is added. + * element 1: true if the key is added. * element 2: optional is seated to the relay time point or * is unseated if has not relayed yet. */ std::pair> diff --git a/src/ripple/overlay/impl/PeerImp.cpp b/src/ripple/overlay/impl/PeerImp.cpp index b63b6a56667..6aadbee4acc 100644 --- a/src/ripple/overlay/impl/PeerImp.cpp +++ b/src/ripple/overlay/impl/PeerImp.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -1944,8 +1945,15 @@ PeerImp::onMessage(std::shared_ptr const& m) return; } - uint256 const ledgerHash{m->ledgerhash()}; + auto const peerId = shared_from_this()->id(); + auto const messageHash = sha512Half(*m); + if (!app_.getHashRouter().addSuppressionPeer(messageHash, peerId)) + { + auto const shortHash = to_string(messageHash).substr(0, 6); + return badData("Duplicate message: " + shortHash); + } + uint256 const ledgerHash{m->ledgerhash()}; // Otherwise check if received data for a candidate transaction set if (m->type() == protocol::liTS_CANDIDATE) { diff --git a/src/ripple/overlay/impl/ProtocolMessage.h b/src/ripple/overlay/impl/ProtocolMessage.h index c338ed4e115..55ae5b441e8 100644 --- a/src/ripple/overlay/impl/ProtocolMessage.h +++ b/src/ripple/overlay/impl/ProtocolMessage.h @@ -43,6 +43,12 @@ protocolMessageType(protocol::TMGetLedger const&) return protocol::mtGET_LEDGER; } +inline protocol::MessageType +protocolMessageType(protocol::TMLedgerData const&) +{ + return protocol::mtLEDGER_DATA; +} + inline protocol::MessageType protocolMessageType(protocol::TMReplayDeltaRequest const&) { @@ -543,6 +549,29 @@ hash_append(Hasher& h, TMGetLedger const& msg) hash_append(h, msg.querydepth()); } +template +void +hash_append(Hasher& h, TMLedgerData const& msg) +{ + using beast::hash_append; + using namespace ripple; + hash_append(h, safe_cast(protocolMessageType(msg))); + hash_append(h, msg.ledgerhash()); + hash_append(h, msg.ledgerseq()); + hash_append(h, safe_cast(msg.type())); + for (auto const& node : msg.nodes()) + { + hash_append(h, node.nodedata()); + if (node.has_nodeid()) + hash_append(h, node.nodeid()); + } + hash_append(h, msg.nodes_size()); + if (msg.has_requestcookie()) + hash_append(h, msg.requestcookie()); + if (msg.has_error()) + hash_append(h, safe_cast(msg.error())); +} + } // namespace protocol #endif