@@ -5825,3 +5825,54 @@ fn test_client_removes_tls12_session_if_server_sends_undecryptable_first_message
58255825 ClientStorageOp :: RemoveTls12Session ( _)
58265826 ) ) ;
58275827}
5828+
5829+ #[ test]
5830+ fn test_complete_io_errors_if_close_notify_received_too_early ( ) {
5831+ let mut server = ServerConnection :: new ( Arc :: new ( make_server_config ( KeyType :: Rsa ) ) ) . unwrap ( ) ;
5832+ let client_hello_followed_by_close_notify_alert = b"\
5833+ \x16 \x03 \x01 \x00 \xc8 \x01 \x00 \x00 \xc4 \x03 \x03 \xec \x12 \xdd \x17 \x64 \
5834+ \xa4 \x39 \xfd \x7e \x8c \x85 \x46 \xb8 \x4d \x1e \xa0 \x6e \xb3 \xd7 \xa0 \x51 \
5835+ \xf0 \x3c \xb8 \x17 \x47 \x0d \x4c \x54 \xc5 \xdf \x72 \x00 \x00 \x1c \xea \xea \
5836+ \xc0 \x2b \xc0 \x2f \xc0 \x2c \xc0 \x30 \xcc \xa9 \xcc \xa8 \xc0 \x13 \xc0 \x14 \
5837+ \x00 \x9c \x00 \x9d \x00 \x2f \x00 \x35 \x00 \x0a \x01 \x00 \x00 \x7f \xda \xda \
5838+ \x00 \x00 \xff \x01 \x00 \x01 \x00 \x00 \x00 \x00 \x16 \x00 \x14 \x00 \x00 \x11 \
5839+ \x77 \x77 \x77 \x2e \x77 \x69 \x6b \x69 \x70 \x65 \x64 \x69 \x61 \x2e \x6f \x72 \
5840+ \x67 \x00 \x17 \x00 \x00 \x00 \x23 \x00 \x00 \x00 \x0d \x00 \x14 \x00 \x12 \x04 \
5841+ \x03 \x08 \x04 \x04 \x01 \x05 \x03 \x08 \x05 \x05 \x01 \x08 \x06 \x06 \x01 \x02 \
5842+ \x01 \x00 \x05 \x00 \x05 \x01 \x00 \x00 \x00 \x00 \x00 \x12 \x00 \x00 \x00 \x10 \
5843+ \x00 \x0e \x00 \x0c \x02 \x68 \x32 \x08 \x68 \x74 \x74 \x70 \x2f \x31 \x2e \x31 \
5844+ \x75 \x50 \x00 \x00 \x00 \x0b \x00 \x02 \x01 \x00 \x00 \x0a \x00 \x0a \x00 \x08 \
5845+ \x1a \x1a \x00 \x1d \x00 \x17 \x00 \x18 \x1a \x1a \x00 \x01 \x00 \
5846+ \x15 \x03 \x03 \x00 \x02 \x01 \x00 ";
5847+
5848+ let mut stream = FakeStream ( client_hello_followed_by_close_notify_alert) ;
5849+ assert_eq ! (
5850+ server
5851+ . complete_io( & mut stream)
5852+ . unwrap_err( )
5853+ . kind( ) ,
5854+ io:: ErrorKind :: UnexpectedEof
5855+ ) ;
5856+ }
5857+
5858+ struct FakeStream < ' a > ( & ' a [ u8 ] ) ;
5859+
5860+ impl < ' a > io:: Read for FakeStream < ' a > {
5861+ fn read ( & mut self , b : & mut [ u8 ] ) -> io:: Result < usize > {
5862+ let take = core:: cmp:: min ( b. len ( ) , self . 0 . len ( ) ) ;
5863+ let ( taken, remain) = self . 0 . split_at ( take) ;
5864+ b[ ..take] . copy_from_slice ( taken) ;
5865+ self . 0 = remain;
5866+ Ok ( take)
5867+ }
5868+ }
5869+
5870+ impl < ' a > io:: Write for FakeStream < ' a > {
5871+ fn write ( & mut self , b : & [ u8 ] ) -> io:: Result < usize > {
5872+ Ok ( b. len ( ) )
5873+ }
5874+
5875+ fn flush ( & mut self ) -> io:: Result < ( ) > {
5876+ Ok ( ( ) )
5877+ }
5878+ }
0 commit comments