@@ -539,23 +539,23 @@ fn do_not_accept_data_after_stop_sending() {
539539 ) ;
540540}
541541
542+ struct Writer ( Vec < u64 > ) ;
543+
544+ impl crate :: connection:: test_internal:: FrameWriter for Writer {
545+ fn write_frames ( & mut self , builder : & mut PacketBuilder ) {
546+ builder. write_varint_frame ( & self . 0 ) ;
547+ }
548+ }
549+
542550#[ test]
543551/// Server sends a number of stream-related frames for a client-initiated stream that is not yet
544552/// created. This should cause the client to close the connection.
545553fn illegal_stream_related_frames ( ) {
546- struct IllegalWriter ( Vec < u64 > ) ;
547-
548- impl crate :: connection:: test_internal:: FrameWriter for IllegalWriter {
549- fn write_frames ( & mut self , builder : & mut PacketBuilder ) {
550- builder. write_varint_frame ( & self . 0 ) ;
551- }
552- }
553-
554554 fn test_with_illegal_frame ( frame : & [ u64 ] ) {
555555 let mut client = default_client ( ) ;
556556 let mut server = default_server ( ) ;
557557 connect ( & mut client, & mut server) ;
558- let dgram = send_with_extra ( & mut server, IllegalWriter ( frame. to_vec ( ) ) , now ( ) ) ;
558+ let dgram = send_with_extra ( & mut server, Writer ( frame. to_vec ( ) ) , now ( ) ) ;
559559 client. process_input ( dgram, now ( ) ) ;
560560 assert ! ( client. state( ) . closed( ) ) ;
561561 }
@@ -576,6 +576,47 @@ fn illegal_stream_related_frames() {
576576 }
577577}
578578
579+ #[ test]
580+ /// Regression <https://github.com/mozilla/neqo/pull/2358>.
581+ fn legal_out_of_order_frame_on_remote_initiated_closed_stream ( ) {
582+ const REQUEST : & [ u8 ] = b"ping" ;
583+ let mut client = default_client ( ) ;
584+ let mut server = default_server ( ) ;
585+ connect ( & mut client, & mut server) ;
586+
587+ // Client sends request and closes stream.
588+ let stream_id = client. stream_create ( StreamType :: BiDi ) . unwrap ( ) ;
589+ _ = client. stream_send ( stream_id, REQUEST ) . unwrap ( ) ;
590+ client. stream_close_send ( stream_id) . unwrap ( ) ;
591+ let dgram = client. process_output ( now ( ) ) . dgram ( ) ;
592+
593+ // Server reads request and closes stream.
594+ server. process_input ( dgram. unwrap ( ) , now ( ) ) ;
595+ let mut buf = [ 0 ; REQUEST . len ( ) ] ;
596+ server. stream_recv ( stream_id, & mut buf) . unwrap ( ) ;
597+ server. stream_close_send ( stream_id) . unwrap ( ) ;
598+ let dgram = server. process_output ( now ( ) ) . dgram ( ) ;
599+ client. process_input ( dgram. unwrap ( ) , now ( ) ) ;
600+
601+ // Client ACKs server's close stream, thus server forgetting about stream.
602+ let dgram = send_something ( & mut client, now ( ) ) ;
603+ let dgram = server. process ( Some ( dgram) , now ( ) ) . dgram ( ) ;
604+ client. process_input ( dgram. unwrap ( ) , now ( ) ) ;
605+
606+ // Deliver an out-of-order `FRAME_TYPE_MAX_STREAM_DATA` on forgotten stream.
607+ let dgram = send_with_extra (
608+ & mut client,
609+ Writer ( vec ! [ FRAME_TYPE_MAX_STREAM_DATA , stream_id. as_u64( ) , 0 , 0 ] ) ,
610+ now ( ) ,
611+ ) ;
612+ server. process_input ( dgram, now ( ) ) ;
613+
614+ assert ! (
615+ !server. state( ) . closed( ) ,
616+ "expect server to ignore out-of-order frame on forgotten stream"
617+ ) ;
618+ }
619+
579620#[ test]
580621// Server sends stop_sending, the client simultaneous sends reset.
581622fn simultaneous_stop_sending_and_reset ( ) {
0 commit comments