@@ -244,6 +244,87 @@ int main(int argc, char **argv)
244
244
EXPECT_SUCCESS (s2n_stuffer_free (& stuffer ));
245
245
EXPECT_SUCCESS (s2n_connection_free (conn ));
246
246
};
247
+
248
+ /* Succeeds for a handshake message larger than the input buffer */
249
+ {
250
+ DEFER_CLEANUP (struct s2n_connection * conn = s2n_connection_new (S2N_CLIENT ),
251
+ s2n_connection_ptr_free );
252
+ EXPECT_NOT_NULL (conn );
253
+
254
+ DEFER_CLEANUP (struct s2n_stuffer stuffer = { 0 }, s2n_stuffer_free );
255
+ EXPECT_SUCCESS (s2n_stuffer_growable_alloc (& stuffer , 0 ));
256
+ EXPECT_SUCCESS (s2n_connection_set_io_stuffers (& stuffer , & stuffer , conn ));
257
+
258
+ uint8_t actual_message_type = 0 ;
259
+
260
+ /* Read a small message to initialize the input buffer */
261
+ const size_t small_message_size = 10 ;
262
+ EXPECT_SUCCESS (s2n_stuffer_write_uint8 (& stuffer , 7 ));
263
+ EXPECT_SUCCESS (s2n_stuffer_write_uint24 (& stuffer , small_message_size ));
264
+ EXPECT_SUCCESS (s2n_stuffer_skip_write (& stuffer , small_message_size ));
265
+ EXPECT_OK (s2n_quic_read_handshake_message (conn , & actual_message_type ));
266
+ EXPECT_EQUAL (s2n_stuffer_data_available (& conn -> in ), small_message_size );
267
+
268
+ EXPECT_SUCCESS (s2n_stuffer_wipe (& conn -> handshake .io ));
269
+ EXPECT_OK (s2n_record_wipe (conn ));
270
+ const size_t max_buffer_size = s2n_stuffer_space_remaining (& conn -> buffer_in );
271
+ EXPECT_TRUE (max_buffer_size > small_message_size );
272
+
273
+ /* Read a large message to force the input buffer to resize */
274
+ const size_t large_message_size = max_buffer_size + 10 ;
275
+ EXPECT_SUCCESS (s2n_stuffer_write_uint8 (& stuffer , 7 ));
276
+ EXPECT_SUCCESS (s2n_stuffer_write_uint24 (& stuffer , large_message_size ));
277
+ EXPECT_SUCCESS (s2n_stuffer_skip_write (& stuffer , large_message_size ));
278
+ EXPECT_OK (s2n_quic_read_handshake_message (conn , & actual_message_type ));
279
+ EXPECT_EQUAL (s2n_stuffer_data_available (& conn -> in ), large_message_size );
280
+
281
+ EXPECT_SUCCESS (s2n_stuffer_wipe (& conn -> handshake .io ));
282
+ EXPECT_OK (s2n_record_wipe (conn ));
283
+ const size_t resized_buffer_size = s2n_stuffer_space_remaining (& conn -> buffer_in );
284
+ EXPECT_TRUE (resized_buffer_size >= large_message_size );
285
+
286
+ /* Read another message to check that the resize doesn't prevent future reads */
287
+ EXPECT_SUCCESS (s2n_stuffer_write_uint8 (& stuffer , 7 ));
288
+ EXPECT_SUCCESS (s2n_stuffer_write_uint24 (& stuffer , TEST_DATA_SIZE ));
289
+ EXPECT_SUCCESS (s2n_stuffer_write_bytes (& stuffer , TEST_DATA , TEST_DATA_SIZE ));
290
+ EXPECT_OK (s2n_quic_read_handshake_message (conn , & actual_message_type ));
291
+ EXPECT_EQUAL (s2n_stuffer_data_available (& conn -> in ), TEST_DATA_SIZE );
292
+ EXPECT_BYTEARRAY_EQUAL (s2n_stuffer_raw_read (& conn -> in , TEST_DATA_SIZE ),
293
+ TEST_DATA , sizeof (TEST_DATA ));
294
+ };
295
+
296
+ /* Succeeds for multiple messages */
297
+ {
298
+ DEFER_CLEANUP (struct s2n_connection * conn = s2n_connection_new (S2N_CLIENT ),
299
+ s2n_connection_ptr_free );
300
+ EXPECT_NOT_NULL (conn );
301
+
302
+ DEFER_CLEANUP (struct s2n_stuffer stuffer = { 0 }, s2n_stuffer_free );
303
+ EXPECT_SUCCESS (s2n_stuffer_growable_alloc (& stuffer , 0 ));
304
+ EXPECT_SUCCESS (s2n_connection_set_io_stuffers (& stuffer , & stuffer , conn ));
305
+
306
+ uint8_t actual_message_type = 0 ;
307
+ size_t expected_buffer_size = 0 ;
308
+ for (size_t i = 0 ; i < 100 ; i ++ ) {
309
+ EXPECT_SUCCESS (s2n_stuffer_write_uint8 (& stuffer , 7 ));
310
+ EXPECT_SUCCESS (s2n_stuffer_write_uint24 (& stuffer , TEST_DATA_SIZE ));
311
+ EXPECT_SUCCESS (s2n_stuffer_write_bytes (& stuffer , TEST_DATA , TEST_DATA_SIZE ));
312
+ EXPECT_OK (s2n_quic_read_handshake_message (conn , & actual_message_type ));
313
+ EXPECT_EQUAL (s2n_stuffer_data_available (& conn -> in ), TEST_DATA_SIZE );
314
+ EXPECT_BYTEARRAY_EQUAL (s2n_stuffer_raw_read (& conn -> in , TEST_DATA_SIZE ),
315
+ TEST_DATA , sizeof (TEST_DATA ));
316
+
317
+ EXPECT_SUCCESS (s2n_stuffer_wipe (& conn -> handshake .io ));
318
+ EXPECT_OK (s2n_record_wipe (conn ));
319
+
320
+ /* Ensure buffer size stays constant */
321
+ const size_t buffer_size = s2n_stuffer_space_remaining (& conn -> buffer_in );
322
+ if (i == 0 ) {
323
+ expected_buffer_size = buffer_size ;
324
+ }
325
+ EXPECT_EQUAL (expected_buffer_size , buffer_size );
326
+ }
327
+ };
247
328
};
248
329
249
330
/* Functional Tests */
0 commit comments