node: Better error message when protocol mismatch

This commit is contained in:
Alexis Sellier 2023-03-15 21:29:09 +01:00
parent c4a66c20d0
commit 17e3c975fb
No known key found for this signature in database
2 changed files with 25 additions and 15 deletions

View File

@ -7,7 +7,7 @@ use std::collections::VecDeque;
use std::os::unix::io::AsRawFd;
use std::os::unix::prelude::RawFd;
use std::sync::Arc;
use std::{fmt, io, net};
use std::{fmt, io, net, str};
use amplify::Wrapper as _;
use crossbeam_channel as chan;
@ -28,8 +28,8 @@ use radicle::storage::WriteStorage;
use crate::crypto::Signer;
use crate::service::reactor::{Fetch, Io};
use crate::service::{session, DisconnectReason, Message, Service};
use crate::wire;
use crate::wire::{Decode, Encode};
use crate::wire::{Decode, Encode, Error};
use crate::worker;
use crate::worker::{Task, TaskResult};
use crate::Link;
use crate::{address, service};
@ -370,7 +370,7 @@ where
let (fetch, drain) = peer.upgraded();
let session = match transport.into_session() {
Ok(session) => session,
Err(_) => panic!("Transport::upgraded: peer write buffer not empty on upgrade"),
Err(_) => panic!("Wire::upgraded: peer write buffer not empty on upgrade"),
};
if self
@ -518,17 +518,27 @@ where
break;
}
Err(e) => {
log::error!(target: "wire", "Invalid message from {id}: {e}");
log::error!(target: "wire", "Invalid gossip message from {id}: {e}");
let mut leftover = if let wire::Error::UnknownMessageType(ty) = e {
ty.to_ne_bytes().to_vec()
} else {
vec![]
};
leftover.extend(inbox.drain(..));
if let Error::UnknownMessageType(t) = e {
let mut leftover = t.to_be_bytes().to_vec();
leftover.extend(inbox.drain(..));
if !leftover.is_empty() {
log::debug!(target: "wire", "Dropping read buffer with `{:?}`", &leftover);
if let Ok(header) =
str::from_utf8(&leftover[..worker::pktline::HEADER_LEN])
{
if header.is_ascii() && !header.is_empty() {
log::error!(
target: "wire",
"Received possible Git packet-line header `{}` from {id} (protocol mismatch)",
header
);
}
}
}
if !inbox.is_empty() {
log::debug!(target: "wire", "Dropping read buffer with {} bytes", inbox.len());
}
self.disconnect(
fd,

View File

@ -315,7 +315,7 @@ impl<G: Signer + Ecdh + 'static> Worker<G> {
loop {
// Read from the daemon and write to the stream.
if let Err(e) = daemon_r.pipe(stream_w, &mut buffer) {
// This is the expected error when the remote disconnects.
// This is the expected error when the daemon disconnects.
if e.kind() == io::ErrorKind::UnexpectedEof {
log::debug!(target: "worker", "Daemon closed the git connection for {}", fetch.rid);
return Err(e.into());
@ -398,7 +398,7 @@ impl Pool {
}
}
mod pktline {
pub mod pktline {
use std::io;
use std::io::Read;
use std::ops::ControlFlow;