1
0
mirror of https://github.com/mariadb-corporation/mariadb-connector-c.git synced 2025-08-08 14:02:17 +03:00

Fix for asynchronous connect:

Unless the connection was successfully established mysql_get_socket will
return INVALID_SOCKET. In this case we need to check if an asynchronous
operation is in progress and return pvio from asynchronous context.
This commit is contained in:
Georg Richter
2015-11-15 08:00:43 +01:00
parent 1af54355b4
commit 9b1cbf15a5
5 changed files with 23 additions and 7 deletions

View File

@@ -166,6 +166,7 @@ extern int my_context_yield(struct my_context *c);
*/
extern int my_context_continue(struct my_context *c);
struct st_ma_pvio;
struct mysql_async_context {
/*
@@ -220,6 +221,7 @@ struct mysql_async_context {
the user data argument just before the context is suspended, and just after
it is resumed.
*/
struct st_ma_pvio *pvio;
void (*suspend_resume_hook)(my_bool suspend, void *user_data);
void *suspend_resume_hook_user_data;
/*

View File

@@ -3251,13 +3251,21 @@ mysql_get_parameters(void)
my_socket STDCALL
mysql_get_socket(const MYSQL *mysql)
{
my_socket sock;
my_socket sock= INVALID_SOCKET;
if (mysql->net.pvio)
{
ma_pvio_get_handle(mysql->net.pvio, &sock);
return sock;
}
return INVALID_SOCKET;
/* if an asynchronous connect is in progress, we need to obtain
pvio handle from async_context until the connection was
successfully established.
*/
else if (mysql->options.extension && mysql->options.extension->async_context &&
mysql->options.extension->async_context->pvio)
{
ma_pvio_get_handle(mysql->options.extension->async_context->pvio, &sock);
}
return sock;
}
/*

View File

@@ -77,7 +77,7 @@ static int native_password_auth_client(MYSQL_PLUGIN_VIO *vio, MYSQL *mysql)
mysql->scramble_buff[SCRAMBLE_LENGTH] = 0;
}
if (mysql->passwd[0])
if (mysql && mysql->passwd[0])
{
char scrambled[SCRAMBLE_LENGTH + 1];
my_scramble_41((uchar *)scrambled, (char*)pkt, mysql->passwd);

View File

@@ -661,6 +661,9 @@ pvio_socket_connect_sync_or_async(MARIADB_PVIO *pvio,
if (mysql->options.extension && mysql->options.extension->async_context &&
mysql->options.extension->async_context->active)
{
/* even if we are not connected yet, application needs to check socket
* via mysql_get_socket api call, so we need to assign pvio */
mysql->options.extension->async_context->pvio= pvio;
pvio_socket_blocking(pvio, 0, 0);
return my_connect_async(pvio, name, namelen, pvio->timeout[PVIO_CONNECT_TIMEOUT]);
}

View File

@@ -118,7 +118,7 @@ wait_for_mysql(MYSQL *mysql, int status)
static int async1(MYSQL *my)
{
int err;
int err, rc;
MYSQL mysql, *ret;
MYSQL_RES *res;
MYSQL_ROW row;
@@ -130,7 +130,8 @@ static int async1(MYSQL *my)
{
mysql_init(&mysql);
mysql_options(&mysql, MYSQL_OPT_NONBLOCK, 0);
rc= mysql_options(&mysql, MYSQL_OPT_NONBLOCK, 0);
check_mysql_rc(rc, (MYSQL *)&mysql);
/* set timeouts to 300 microseconds */
default_timeout= 300;
@@ -193,9 +194,11 @@ static int async1(MYSQL *my)
static int test_conc131(MYSQL *my)
{
int rc;
/* this test needs to run under valgrind */
MYSQL *mysql=mysql_init(NULL);
mysql_options(mysql, MYSQL_OPT_NONBLOCK, 0);
rc= mysql_options(mysql, MYSQL_OPT_NONBLOCK, 0);
check_mysql_rc(rc, mysql);
mysql_close(mysql);
return OK;
}