@@ -10458,9 +10458,7 @@ TEST(SSLTest, ErrorSyscallAfterCloseNotify) {
1045810458 write_failed = false ;
1045910459}
1046010460
10461- // Test that |SSL_MODE_AUTO_RETRY| suppresses failure on (potentially)
10462- // transient empty reads.
10463- TEST (SSLTest, IntermittentEmptyRead) {
10461+ static void TestIntermittentEmptyRead (bool auto_retry) {
1046410462 bssl::UniquePtr<SSL_CTX> client_ctx (SSL_CTX_new (TLS_method ()));
1046510463 bssl::UniquePtr<SSL_CTX> server_ctx =
1046610464 CreateContextWithTestCertificate (TLS_method ());
@@ -10491,20 +10489,31 @@ TEST(SSLTest, IntermittentEmptyRead) {
1049110489 ASSERT_TRUE (BIO_up_ref (client_rbio.get ()));
1049210490 SSL_set0_rbio (client.get (), rbio_empty.release ());
1049310491
10494- // |SSL_MODE_AUTO_RETRY| is off by default
10495- ASSERT_FALSE (SSL_CTX_get_mode (client_ctx.get ()) & SSL_MODE_AUTO_RETRY);
10492+ if (auto_retry) {
10493+ // Set flag under test
10494+ ASSERT_TRUE (SSL_CTX_set_mode (client_ctx.get (), SSL_MODE_AUTO_RETRY));
10495+ ASSERT_TRUE (SSL_CTX_get_mode (client_ctx.get ()) & SSL_MODE_AUTO_RETRY);
10496+ } else {
10497+ // |SSL_MODE_AUTO_RETRY| is off by default
10498+ ASSERT_FALSE (SSL_CTX_get_mode (client_ctx.get ()) & SSL_MODE_AUTO_RETRY);
10499+ }
1049610500
1049710501 // Server writes some data to the client
1049810502 const uint8_t write_data[] = {1 , 2 , 3 };
1049910503 int ret = SSL_write (server.get (), write_data, (int ) sizeof (write_data));
1050010504 EXPECT_EQ (ret, (int ) sizeof (write_data));
1050110505 EXPECT_EQ (SSL_get_error (server.get (), ret), SSL_ERROR_NONE);
1050210506
10503- // On empty read, client should error out signaling EOF
1050410507 uint8_t read_data[] = {0 , 0 , 0 };
1050510508 ret = SSL_read (client.get (), read_data, sizeof (read_data));
1050610509 EXPECT_EQ (ret, 0 );
10507- EXPECT_EQ (SSL_get_error (client.get (), ret), SSL_ERROR_SYSCALL);
10510+ if (auto_retry) {
10511+ // On empty read, client should still want a read so caller will retry
10512+ EXPECT_EQ (SSL_get_error (client.get (), ret), SSL_ERROR_WANT_READ);
10513+ } else {
10514+ // On empty read, client should error out signaling EOF
10515+ EXPECT_EQ (SSL_get_error (client.get (), ret), SSL_ERROR_SYSCALL);
10516+ }
1050810517
1050910518 // Reset client rbio, read should succeed
1051010519 SSL_set0_rbio (client.get (), client_rbio.release ());
@@ -10517,47 +10526,13 @@ TEST(SSLTest, IntermittentEmptyRead) {
1051710526 ret = SSL_read (client.get (), read_data, sizeof (read_data));
1051810527 EXPECT_LT (ret, 0 );
1051910528 EXPECT_EQ (SSL_get_error (client.get (), ret), SSL_ERROR_WANT_READ);
10529+ }
1052010530
10521- // Next, setu up the same test with |SSL_MODE_AUTO_RETRY| set
10522- client_ctx.reset (SSL_CTX_new (TLS_method ()));
10523- server_ctx = CreateContextWithTestCertificate (TLS_method ());
10524- ASSERT_TRUE (client_ctx);
10525- ASSERT_TRUE (server_ctx);
10526- ASSERT_TRUE (ConnectClientAndServer (&client, &server, client_ctx.get (),
10527- server_ctx.get ()));
10528- rbio_empty.reset (BIO_new (method.get ()));
10529- ASSERT_TRUE (rbio_empty);
10530- BIO_set_flags (rbio_empty.get (), BIO_FLAGS_READ);
10531- client_rbio.reset (SSL_get_rbio (client.get ()));
10532- ASSERT_TRUE (client_rbio);
10533- ASSERT_TRUE (BIO_up_ref (client_rbio.get ()));
10534- SSL_set0_rbio (client.get (), rbio_empty.release ());
10535-
10536- // Set flag under test
10537- ASSERT_TRUE (SSL_CTX_set_mode (client_ctx.get (), SSL_MODE_AUTO_RETRY));
10538- ASSERT_TRUE (SSL_CTX_get_mode (client_ctx.get ()) & SSL_MODE_AUTO_RETRY);
10539-
10540- // Server writes some data to the client
10541- ret = SSL_write (server.get (), write_data, (int ) sizeof (write_data));
10542- EXPECT_EQ (ret, (int ) sizeof (write_data));
10543- EXPECT_EQ (SSL_get_error (server.get (), ret), SSL_ERROR_NONE);
10544-
10545- // On empty read, client should still want a read so caller will retry
10546- ret = SSL_read (client.get (), read_data, sizeof (read_data));
10547- EXPECT_EQ (ret, 0 );
10548- EXPECT_EQ (SSL_get_error (client.get (), ret), SSL_ERROR_WANT_READ);
10549-
10550- // Reset client rbio, read should succeed
10551- SSL_set0_rbio (client.get (), client_rbio.release ());
10552- ret = SSL_read (client.get (), read_data, sizeof (read_data));
10553- EXPECT_EQ (ret, (int ) sizeof (write_data));
10554- EXPECT_EQ (OPENSSL_memcmp (read_data, write_data, sizeof (write_data)), 0 );
10555- EXPECT_EQ (SSL_get_error (client.get (), ret), SSL_ERROR_NONE);
10556-
10557- // Subsequent attempts to read should fail
10558- ret = SSL_read (client.get (), read_data, sizeof (read_data));
10559- EXPECT_LT (ret, 0 );
10560- EXPECT_EQ (SSL_get_error (client.get (), ret), SSL_ERROR_WANT_READ);
10531+ // Test that |SSL_MODE_AUTO_RETRY| suppresses failure on (potentially)
10532+ // transient empty reads.
10533+ TEST (SSLTest, IntermittentEmptyRead) {
10534+ TestIntermittentEmptyRead (false );
10535+ TestIntermittentEmptyRead (true );
1056110536}
1056210537
1056310538// Test that |SSL_shutdown|, when quiet shutdown is enabled, simulates receiving
0 commit comments