Radish alpha
h
Radicle Heartwood Protocol & Stack
Radicle
Git (anonymous pull)
Log in to clone via SSH
node: Better error message when protocol mismatch
Alexis Sellier committed 3 years ago
commit 17e3c975fb16fcf980953645b465c1550bf20fdf
parent c4a66c20d0b73cfd61e8e25da730e524ee8ae796
2 files changed +26 -16
modified radicle-node/src/wire/protocol.rs
@@ -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}");
-

-
                                let mut leftover = if let wire::Error::UnknownMessageType(ty) = e {
-
                                    ty.to_ne_bytes().to_vec()
-
                                } else {
-
                                    vec![]
-
                                };
-
                                leftover.extend(inbox.drain(..));
+
                                log::error!(target: "wire", "Invalid gossip message from {id}: {e}");
+

+
                                if let Error::UnknownMessageType(t) = e {
+
                                    let mut leftover = t.to_be_bytes().to_vec();
+
                                    leftover.extend(inbox.drain(..));
+

+
                                    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 !leftover.is_empty() {
-
                                    log::debug!(target: "wire", "Dropping read buffer with `{:?}`", &leftover);
+
                                if !inbox.is_empty() {
+
                                    log::debug!(target: "wire", "Dropping read buffer with {} bytes", inbox.len());
                                }
                                self.disconnect(
                                    fd,
modified radicle-node/src/worker.rs
@@ -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;