@@ -564,3 +564,56 @@ mod channels {
564564 . await ;
565565 }
566566}
567+
568+ mod server_kex_junk {
569+ use std:: sync:: Arc ;
570+
571+ use tokio:: io:: AsyncWriteExt ;
572+
573+ use super :: server:: Server as _;
574+ use super :: * ;
575+
576+ #[ tokio:: test]
577+ async fn server_kex_junk_test ( ) {
578+ let _ = env_logger:: try_init ( ) ;
579+
580+ let config = server:: Config :: default ( ) ;
581+ let config = Arc :: new ( config) ;
582+ let mut sh = Server { } ;
583+
584+ let socket = tokio:: net:: TcpListener :: bind ( "127.0.0.1:0" ) . await . unwrap ( ) ;
585+ let addr = socket. local_addr ( ) . unwrap ( ) ;
586+
587+ tokio:: spawn ( async move {
588+ let mut client_stream = tokio:: net:: TcpStream :: connect ( addr) . await . unwrap ( ) ;
589+ client_stream
590+ . write_all ( b"SSH-2.0-Client_1.0\r \n " )
591+ . await
592+ . unwrap ( ) ;
593+ // Unexpected message pre-kex
594+ client_stream. write_all ( & [ 0 , 0 , 0 , 2 , 0 , 99 ] ) . await . unwrap ( ) ;
595+ tokio:: time:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) . await ;
596+ } ) ;
597+
598+ let ( socket, _) = socket. accept ( ) . await . unwrap ( ) ;
599+ let server = sh. new_client ( socket. peer_addr ( ) . ok ( ) ) ;
600+ let rs = server:: run_stream ( config, socket, server) . await . unwrap ( ) ;
601+
602+ // May not panic
603+ assert ! ( rs. await . is_err( ) ) ;
604+ }
605+
606+ #[ derive( Clone ) ]
607+ struct Server { }
608+
609+ impl server:: Server for Server {
610+ type Handler = Self ;
611+ fn new_client ( & mut self , _: Option < std:: net:: SocketAddr > ) -> Self {
612+ self . clone ( )
613+ }
614+ }
615+
616+ impl server:: Handler for Server {
617+ type Error = super :: Error ;
618+ }
619+ }
0 commit comments