diff --git a/mysql-test/t/async_client_ssl_leak.test b/mysql-test/t/async_client_ssl_leak.test new file mode 100644 index 00000000000..26edfa4ac1e --- /dev/null +++ b/mysql-test/t/async_client_ssl_leak.test @@ -0,0 +1 @@ +--exec $MYSQL_CLIENT_TEST test_async_client_ssl_leak diff --git a/testclients/mysql_client_test.cc b/testclients/mysql_client_test.cc index 7047c578a8d..edd8b07a9e3 100644 --- a/testclients/mysql_client_test.cc +++ b/testclients/mysql_client_test.cc @@ -5123,6 +5123,30 @@ static void test_prepare_multi_statements() { mysql_close(mysql_local); } +static void test_async_client_ssl_leak() { + MYSQL *mysql_local; + myheader("async_client_ssl_leak"); + DBUG_SET("+d,async_client_ssl_leak"); + + if (!(mysql_local = mysql_client_init(NULL))) { + fprintf(stderr, "\n mysql_client_init() failed"); + exit(1); + } + + net_async_status status; + bool exit_loop = false; + do { + status = mysql_real_connect_nonblocking( + mysql_local, opt_host, opt_user, opt_password, current_db, opt_port, + opt_unix_socket, CLIENT_MULTI_STATEMENTS); + DBUG_EXECUTE_IF("async_client_ssl_leak_ssl_started", { exit_loop = true; }); + } while (status == NET_ASYNC_NOT_READY && !exit_loop); + + mysql_close(mysql_local); + DBUG_SET("-d,async_client_ssl_leak"); + DBUG_SET("-d,async_client_ssl_leak_ssl_started"); +} + /* Test simple bind store result */ static void test_store_result() { @@ -20800,6 +20824,7 @@ static struct my_tests_st my_tests[] = { {"test_multi_stmt", test_multi_stmt}, {"test_multi_statements", test_multi_statements}, {"test_prepare_multi_statements", test_prepare_multi_statements}, + {"test_async_client_ssl_leak", test_async_client_ssl_leak}, {"test_store_result", test_store_result}, {"test_store_result1", test_store_result1}, {"test_store_result2", test_store_result2}, diff --git a/vio/viossl.cc b/vio/viossl.cc index 34e7946ebc1..bee70852eba 100644 --- a/vio/viossl.cc +++ b/vio/viossl.cc @@ -461,6 +461,11 @@ static ssize_t ssl_handshake_loop(Vio *vio, SSL *ssl, ssl_handshake_func_t func, /* Process the SSL I/O error. */ if (!ssl_should_retry(vio, handshake_ret, &event, ssl_errno_holder)) break; + DBUG_EXECUTE_IF("async_client_ssl_leak", { + DBUG_SET("+d,async_client_ssl_leak_ssl_started"); + DBUG_RETURN(VIO_SOCKET_WANT_READ); + }); + if (!vio->is_blocking_flag) { switch (event) {