Skip to content

Commit

Permalink
net: require a verack before responding to anything else
Browse files Browse the repository at this point in the history
7a8c251 made this logic hard to follow. After that change, messages would
not be sent to a peer via SendMessages() before the handshake was complete, but
messages could still be sent as a response to an incoming message.

For example, if a peer had not yet sent a verack, we wouldn't notify it about
new blocks, but we would respond to a PING with a PONG.

This change makes the behavior straightforward: until we've received a verack,
never send any message other than version/verack/reject.

The behavior until a VERACK is received has always been undefined, this change
just tightens our policy.

This also makes testing much easier, because we can now connect but not send
version/verack, and anything sent to us is an error.
  • Loading branch information
theuni authored and furszy committed Nov 22, 2021
1 parent 8a6c72b commit 475b1c6
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/net_processing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1290,6 +1290,14 @@ bool static ProcessMessage(CNode* pfrom, std::string strCommand, CDataStream& vR
(fLogIPs ? strprintf(", peeraddr=%s", pfrom->addr.ToString()) : ""));
}

else if (!pfrom->fSuccessfullyConnected)
{
// Must have a verack message before anything else
LOCK(cs_main);
Misbehaving(pfrom->GetId(), 1);
return false;
}


else if (strCommand == NetMsgType::ADDR || strCommand == NetMsgType::ADDRV2) {
int stream_version = vRecv.GetVersion();
Expand Down

0 comments on commit 475b1c6

Please sign in to comment.