Ignore non-verack and non-version messages in handshake (#3522)
* ignore non-verack message in handshake * ignore non-version message in handshake * add loops for waiting * improve logging Co-authored-by: teor <teor@riseup.net> Co-authored-by: teor <teor@riseup.net>
This commit is contained in:
parent
31d88997a4
commit
83827b9d03
|
|
@ -588,13 +588,29 @@ where
|
||||||
debug!(?our_version, "sending initial version message");
|
debug!(?our_version, "sending initial version message");
|
||||||
peer_conn.send(our_version).await?;
|
peer_conn.send(our_version).await?;
|
||||||
|
|
||||||
let remote_msg = peer_conn
|
let mut remote_msg = peer_conn
|
||||||
.next()
|
.next()
|
||||||
.await
|
.await
|
||||||
.ok_or(HandshakeError::ConnectionClosed)??;
|
.ok_or(HandshakeError::ConnectionClosed)??;
|
||||||
|
|
||||||
// Check that we got a Version and destructure its fields into the local scope.
|
// Wait for next message if the one we got is not Version
|
||||||
debug!(?remote_msg, "got message from remote peer");
|
loop {
|
||||||
|
match remote_msg {
|
||||||
|
Message::Version { .. } => {
|
||||||
|
debug!(?remote_msg, "got version message from remote peer");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
remote_msg = peer_conn
|
||||||
|
.next()
|
||||||
|
.await
|
||||||
|
.ok_or(HandshakeError::ConnectionClosed)??;
|
||||||
|
debug!(?remote_msg, "ignoring non-version message from remote peer");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we got a Version message, destructure its fields into the local scope.
|
||||||
let (remote_nonce, remote_services, remote_version, remote_canonical_addr, user_agent) =
|
let (remote_nonce, remote_services, remote_version, remote_canonical_addr, user_agent) =
|
||||||
if let Message::Version {
|
if let Message::Version {
|
||||||
version,
|
version,
|
||||||
|
|
@ -700,14 +716,26 @@ where
|
||||||
|
|
||||||
peer_conn.send(Message::Verack).await?;
|
peer_conn.send(Message::Verack).await?;
|
||||||
|
|
||||||
let remote_msg = peer_conn
|
let mut remote_msg = peer_conn
|
||||||
.next()
|
.next()
|
||||||
.await
|
.await
|
||||||
.ok_or(HandshakeError::ConnectionClosed)??;
|
.ok_or(HandshakeError::ConnectionClosed)??;
|
||||||
if let Message::Verack = remote_msg {
|
|
||||||
debug!("got verack from remote peer");
|
// Wait for next message if the one we got is not Verack
|
||||||
} else {
|
loop {
|
||||||
Err(HandshakeError::UnexpectedMessage(Box::new(remote_msg)))?;
|
match remote_msg {
|
||||||
|
Message::Verack => {
|
||||||
|
debug!(?remote_msg, "got verack message from remote peer");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
remote_msg = peer_conn
|
||||||
|
.next()
|
||||||
|
.await
|
||||||
|
.ok_or(HandshakeError::ConnectionClosed)??;
|
||||||
|
debug!(?remote_msg, "ignoring non-verack message from remote peer");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok((remote_version, remote_services, remote_canonical_addr))
|
Ok((remote_version, remote_services, remote_canonical_addr))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue