node: Better error message when protocol mismatch
This commit is contained in:
parent
c4a66c20d0
commit
17e3c975fb
|
|
@ -7,7 +7,7 @@ use std::collections::VecDeque;
|
||||||
use std::os::unix::io::AsRawFd;
|
use std::os::unix::io::AsRawFd;
|
||||||
use std::os::unix::prelude::RawFd;
|
use std::os::unix::prelude::RawFd;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::{fmt, io, net};
|
use std::{fmt, io, net, str};
|
||||||
|
|
||||||
use amplify::Wrapper as _;
|
use amplify::Wrapper as _;
|
||||||
use crossbeam_channel as chan;
|
use crossbeam_channel as chan;
|
||||||
|
|
@ -28,8 +28,8 @@ use radicle::storage::WriteStorage;
|
||||||
use crate::crypto::Signer;
|
use crate::crypto::Signer;
|
||||||
use crate::service::reactor::{Fetch, Io};
|
use crate::service::reactor::{Fetch, Io};
|
||||||
use crate::service::{session, DisconnectReason, Message, Service};
|
use crate::service::{session, DisconnectReason, Message, Service};
|
||||||
use crate::wire;
|
use crate::wire::{Decode, Encode, Error};
|
||||||
use crate::wire::{Decode, Encode};
|
use crate::worker;
|
||||||
use crate::worker::{Task, TaskResult};
|
use crate::worker::{Task, TaskResult};
|
||||||
use crate::Link;
|
use crate::Link;
|
||||||
use crate::{address, service};
|
use crate::{address, service};
|
||||||
|
|
@ -370,7 +370,7 @@ where
|
||||||
let (fetch, drain) = peer.upgraded();
|
let (fetch, drain) = peer.upgraded();
|
||||||
let session = match transport.into_session() {
|
let session = match transport.into_session() {
|
||||||
Ok(session) => 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
|
if self
|
||||||
|
|
@ -518,17 +518,27 @@ where
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Err(e) => {
|
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 {
|
if let Error::UnknownMessageType(t) = e {
|
||||||
ty.to_ne_bytes().to_vec()
|
let mut leftover = t.to_be_bytes().to_vec();
|
||||||
} else {
|
leftover.extend(inbox.drain(..));
|
||||||
vec![]
|
|
||||||
};
|
|
||||||
leftover.extend(inbox.drain(..));
|
|
||||||
|
|
||||||
if !leftover.is_empty() {
|
if let Ok(header) =
|
||||||
log::debug!(target: "wire", "Dropping read buffer with `{:?}`", &leftover);
|
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(
|
self.disconnect(
|
||||||
fd,
|
fd,
|
||||||
|
|
|
||||||
|
|
@ -315,7 +315,7 @@ impl<G: Signer + Ecdh + 'static> Worker<G> {
|
||||||
loop {
|
loop {
|
||||||
// Read from the daemon and write to the stream.
|
// Read from the daemon and write to the stream.
|
||||||
if let Err(e) = daemon_r.pipe(stream_w, &mut buffer) {
|
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 {
|
if e.kind() == io::ErrorKind::UnexpectedEof {
|
||||||
log::debug!(target: "worker", "Daemon closed the git connection for {}", fetch.rid);
|
log::debug!(target: "worker", "Daemon closed the git connection for {}", fetch.rid);
|
||||||
return Err(e.into());
|
return Err(e.into());
|
||||||
|
|
@ -398,7 +398,7 @@ impl Pool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mod pktline {
|
pub mod pktline {
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue