mirror of
https://github.com/n0-computer/noq.git
synced 2026-09-18 17:26:19 +00:00
Fix panics on invalid transport parameters
This commit is contained in:
@@ -18,7 +18,7 @@ use packet::{
|
||||
};
|
||||
use range_set::RangeSet;
|
||||
use stream::{self, Stream};
|
||||
use transport_parameters::TransportParameters;
|
||||
use transport_parameters::{self, TransportParameters};
|
||||
use {
|
||||
frame, Directionality, Frame, Side, StreamId, TransportError, MIN_INITIAL_SIZE, MIN_MTU,
|
||||
VERSION,
|
||||
@@ -890,7 +890,7 @@ impl Connection {
|
||||
now: u64,
|
||||
packet_number: u64,
|
||||
payload: Bytes,
|
||||
) -> Result<(), TLSError> {
|
||||
) -> Result<(), TransportError> {
|
||||
let frame = if let Ok(Some(frame)) = parse_initial(&ctx.log, payload) {
|
||||
frame
|
||||
} else {
|
||||
@@ -907,11 +907,13 @@ impl Connection {
|
||||
};
|
||||
let mut tls = TlsSession::new_server(&ctx.config.tls_server_config, &server_params);
|
||||
self.read_tls(&mut tls, &frame);
|
||||
tls.process_new_packets()?;
|
||||
if tls.process_new_packets().is_err() {
|
||||
return Err(TransportError::TLS_HANDSHAKE_FAILED);
|
||||
}
|
||||
let params = TransportParameters::read(
|
||||
Side::Server,
|
||||
&mut io::Cursor::new(tls.get_quic_transport_parameters().unwrap()),
|
||||
).unwrap();
|
||||
)?;
|
||||
self.handshake_complete(ctx, tls, params, now, packet_number);
|
||||
Ok(())
|
||||
}
|
||||
@@ -1088,7 +1090,7 @@ impl Connection {
|
||||
let params = TransportParameters::read(
|
||||
self.side,
|
||||
&mut io::Cursor::new(params),
|
||||
).unwrap();
|
||||
)?;
|
||||
self.set_params(params);
|
||||
} else {
|
||||
debug!(ctx.log, "remote didn't send transport params");
|
||||
@@ -2437,6 +2439,12 @@ impl From<state::CloseReason> for ConnectionError {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<transport_parameters::Error> for ConnectionError {
|
||||
fn from(e: transport_parameters::Error) -> Self {
|
||||
TransportError::from(e).into()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Fail, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
||||
pub enum ReadError {
|
||||
/// No more data is currently available on this stream.
|
||||
|
||||
@@ -2,7 +2,7 @@ use bytes::{Buf, BufMut};
|
||||
|
||||
use coding::{BufExt, BufMutExt};
|
||||
use endpoint::Config;
|
||||
use {Side, VERSION};
|
||||
use {Side, TransportError, VERSION};
|
||||
|
||||
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
||||
pub struct TransportParameters {
|
||||
@@ -56,6 +56,15 @@ pub enum Error {
|
||||
Malformed,
|
||||
}
|
||||
|
||||
impl From<Error> for TransportError {
|
||||
fn from(e: Error) -> Self {
|
||||
match e {
|
||||
Error::VersionNegotiation => TransportError::VERSION_NEGOTIATION_ERROR,
|
||||
Error::IllegalValue | Error::Malformed => TransportError::TRANSPORT_PARAMETER_ERROR,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl TransportParameters {
|
||||
pub fn write<W: BufMut>(&self, side: Side, w: &mut W) {
|
||||
if side == Side::Server {
|
||||
|
||||
Reference in New Issue
Block a user