If an quinn::Endpoint is dropped while it internally contains pending Incoming, those proto::Incoming will be dropped without dismissing their improper drop warner. This will trigger the "WARN: quinn_proto::endpoint:1223: quinn_proto::Incoming dropped without passing to Endpoint::accept/refuse/retry/ignore (may cause memory leak and eventual inability to accept new connections)" warning. The warning is not indicative of an actual problem in this case, however, because the endpoint is being dropped too.
Repro script
```rs
use anyhow::Error;
use quinn::*;
use std::{net::ToSocketAddrs as _, sync::Arc};
use tracing::*;
use tracing_subscriber::prelude::*;
#[tokio::main]
async fn main() {
let t0 = std::time::Instant::now();
// init logging
let log_fmt = tracing_subscriber::fmt::format()
.compact()
//.json()
//.with_span_list(true)
//.with_current_span(false)
.with_timer(tracing_subscriber::fmt::time::uptime())
.with_line_number(true);
let stdout_log = tracing_subscriber::fmt::layer()
//.fmt_fields(tracing_subscriber::fmt::format::JsonFields::new())
.event_format(log_fmt);
let log_filter = tracing_subscriber::EnvFilter::new(
std::env::var(tracing_subscriber::EnvFilter::DEFAULT_ENV).unwrap_or("info".into()),
);
let log_subscriber = tracing_subscriber::Registry::default()
.with(log_filter)
.with(stdout_log);
tracing::subscriber::set_global_default(log_subscriber).expect("unable to install logger");
// generate keys (new version of Rustls)
let rcgen_cert = rcgen::generate_simple_self_signed(vec!["localhost".into()]).unwrap();
let key = rustls::pki_types::PrivatePkcs8KeyDer::from(rcgen_cert.key_pair.serialize_der());
let cert = rustls::pki_types::CertificateDer::from(rcgen_cert.cert);
let mut roots = rustls::RootCertStore::empty();
roots.add(cert.clone()).unwrap();
let certs = vec![cert];
/*
// generate keys (old version of Rustls)
let rcgen_cert = rcgen::generate_simple_self_signed(vec!["localhost".into()]).unwrap();
let key = rustls::PrivateKey(rcgen_cert.serialize_private_key_der());
let cert = rustls::Certificate(rcgen_cert.serialize_der().unwrap());
let mut roots = rustls::RootCertStore::empty();
roots.add(&cert).unwrap();
let certs = vec![cert];
*/
let mut tasks = tokio::task::JoinSet::new();
// start server
fn spawn_server(
certs: &Vec>,
key: &rustls::pki_types::PrivatePkcs8KeyDer,
) -> (tokio::sync::oneshot::Sender<()>, impl std::future::Future
If an
quinn::Endpoint
is dropped while it internally contains pendingIncoming
, thoseproto::Incoming
will be dropped without dismissing their improper drop warner. This will trigger the "WARN: quinn_proto::endpoint:1223: quinn_proto::Incoming dropped without passing to Endpoint::accept/refuse/retry/ignore (may cause memory leak and eventual inability to accept new connections)
" warning. The warning is not indicative of an actual problem in this case, however, because the endpoint is being dropped too.Repro script
```rs use anyhow::Error; use quinn::*; use std::{net::ToSocketAddrs as _, sync::Arc}; use tracing::*; use tracing_subscriber::prelude::*; #[tokio::main] async fn main() { let t0 = std::time::Instant::now(); // init logging let log_fmt = tracing_subscriber::fmt::format() .compact() //.json() //.with_span_list(true) //.with_current_span(false) .with_timer(tracing_subscriber::fmt::time::uptime()) .with_line_number(true); let stdout_log = tracing_subscriber::fmt::layer() //.fmt_fields(tracing_subscriber::fmt::format::JsonFields::new()) .event_format(log_fmt); let log_filter = tracing_subscriber::EnvFilter::new( std::env::var(tracing_subscriber::EnvFilter::DEFAULT_ENV).unwrap_or("info".into()), ); let log_subscriber = tracing_subscriber::Registry::default() .with(log_filter) .with(stdout_log); tracing::subscriber::set_global_default(log_subscriber).expect("unable to install logger"); // generate keys (new version of Rustls) let rcgen_cert = rcgen::generate_simple_self_signed(vec!["localhost".into()]).unwrap(); let key = rustls::pki_types::PrivatePkcs8KeyDer::from(rcgen_cert.key_pair.serialize_der()); let cert = rustls::pki_types::CertificateDer::from(rcgen_cert.cert); let mut roots = rustls::RootCertStore::empty(); roots.add(cert.clone()).unwrap(); let certs = vec![cert]; /* // generate keys (old version of Rustls) let rcgen_cert = rcgen::generate_simple_self_signed(vec!["localhost".into()]).unwrap(); let key = rustls::PrivateKey(rcgen_cert.serialize_private_key_der()); let cert = rustls::Certificate(rcgen_cert.serialize_der().unwrap()); let mut roots = rustls::RootCertStore::empty(); roots.add(&cert).unwrap(); let certs = vec![cert]; */ let mut tasks = tokio::task::JoinSet::new(); // start server fn spawn_server( certs: &VecI can make a PR to fix.