@@ -5825,3 +5825,54 @@ fn test_client_removes_tls12_session_if_server_sends_undecryptable_first_message
5825
5825
ClientStorageOp :: RemoveTls12Session ( _)
5826
5826
) ) ;
5827
5827
}
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