You've already forked mariadb-connector-c
mirror of
https://github.com/mariadb-corporation/mariadb-connector-c.git
synced 2025-08-08 14:02:17 +03:00
Fix for aurora: remember options when trying to connect inside
plugin to avoid double free of options
This commit is contained in:
@@ -1323,7 +1323,9 @@ mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
|
|||||||
mysql->net.conn_hdlr->plugin= plugin;
|
mysql->net.conn_hdlr->plugin= plugin;
|
||||||
|
|
||||||
if (plugin && plugin->connect)
|
if (plugin && plugin->connect)
|
||||||
|
{
|
||||||
return plugin->connect(mysql, end, user, passwd, db, port, unix_socket, client_flag);
|
return plugin->connect(mysql, end, user, passwd, db, port, unix_socket, client_flag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return mysql->methods->db_connect(mysql, host, user, passwd,
|
return mysql->methods->db_connect(mysql, host, user, passwd,
|
||||||
|
@@ -362,7 +362,7 @@ MYSQL *aurora_connect_instance(AURORA *aurora, AURORA_INSTANCE *instance, MYSQL
|
|||||||
aurora->database,
|
aurora->database,
|
||||||
instance->port ? instance->port : aurora->port,
|
instance->port ? instance->port : aurora->port,
|
||||||
NULL,
|
NULL,
|
||||||
aurora->client_flag))
|
aurora->client_flag | CLIENT_REMEMBER_OPTIONS))
|
||||||
{
|
{
|
||||||
/* connection not available */
|
/* connection not available */
|
||||||
instance->blacklisted= time(NULL);
|
instance->blacklisted= time(NULL);
|
||||||
@@ -630,8 +630,13 @@ MYSQL *aurora_connect(MYSQL *mysql, const char *host, const char *user, const ch
|
|||||||
aurora->active[AURORA_PRIMARY]= 1;
|
aurora->active[AURORA_PRIMARY]= 1;
|
||||||
aurora->pvio[AURORA_PRIMARY]= aurora->mysql[AURORA_PRIMARY]->net.pvio;
|
aurora->pvio[AURORA_PRIMARY]= aurora->mysql[AURORA_PRIMARY]->net.pvio;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
aurora->pvio[AURORA_PRIMARY]= NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!aurora->pvio[AURORA_PRIMARY] && !aurora->pvio[AURORA_REPLICA])
|
||||||
|
goto error;
|
||||||
|
|
||||||
aurora_switch_connection(mysql, aurora, AURORA_PRIMARY);
|
aurora_switch_connection(mysql, aurora, AURORA_PRIMARY);
|
||||||
ENABLE_AURORA(mysql);
|
ENABLE_AURORA(mysql);
|
||||||
return mysql;
|
return mysql;
|
||||||
@@ -676,6 +681,11 @@ void aurora_close(MYSQL *mysql)
|
|||||||
MA_CONNECTION_HANDLER *hdlr= mysql->net.conn_hdlr;
|
MA_CONNECTION_HANDLER *hdlr= mysql->net.conn_hdlr;
|
||||||
AURORA *aurora= (AURORA *)hdlr->data;
|
AURORA *aurora= (AURORA *)hdlr->data;
|
||||||
|
|
||||||
|
if (!aurora->pvio[AURORA_PRIMARY] && !aurora->pvio[AURORA_REPLICA])
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
aurora_switch_connection(mysql, aurora, AURORA_PRIMARY);
|
aurora_switch_connection(mysql, aurora, AURORA_PRIMARY);
|
||||||
|
|
||||||
/* if the connection is not active yet, just return */
|
/* if the connection is not active yet, just return */
|
||||||
@@ -702,7 +712,7 @@ void aurora_close(MYSQL *mysql)
|
|||||||
mariadb_api->mysql_close(aurora->mysql[AURORA_PRIMARY]);
|
mariadb_api->mysql_close(aurora->mysql[AURORA_PRIMARY]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* free masrwe information */
|
/* free information */
|
||||||
aurora_close_memory(aurora);
|
aurora_close_memory(aurora);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
@@ -21,9 +21,11 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include
|
|||||||
${CMAKE_SOURCE_DIR}/unittest/mytap)
|
${CMAKE_SOURCE_DIR}/unittest/mytap)
|
||||||
ADD_DEFINITIONS(-DLIBMARIADB)
|
ADD_DEFINITIONS(-DLIBMARIADB)
|
||||||
|
|
||||||
SET(API_TESTS "t_aurora" "async" "basic-t" "fetch" "charset" "logs" "cursor" "errors" "view" "ps" "ps_bugs"
|
SET(API_TESTS "async" "basic-t" "fetch" "charset" "logs" "cursor" "errors" "view" "ps" "ps_bugs"
|
||||||
"sp" "result" "connection" "misc" "ps_new" "sqlite3" "thread" "dyncol")
|
"sp" "result" "connection" "misc" "ps_new" "sqlite3" "thread" "dyncol")
|
||||||
|
|
||||||
|
#exclude following tests from ctests, since we need to run them maually with different credentials
|
||||||
|
SET(MANUAL_TESTS "t_aurora")
|
||||||
# Get finger print from server certificate
|
# Get finger print from server certificate
|
||||||
IF(WITH_SSL)
|
IF(WITH_SSL)
|
||||||
|
|
||||||
@@ -62,3 +64,8 @@ FOREACH(API_TEST ${API_TESTS})
|
|||||||
ADD_TEST(${API_TEST} ${EXECUTABLE_OUTPUT_PATH}/${API_TEST})
|
ADD_TEST(${API_TEST} ${EXECUTABLE_OUTPUT_PATH}/${API_TEST})
|
||||||
SET_TESTS_PROPERTIES(${API_TEST} PROPERTIES TIMEOUT 120)
|
SET_TESTS_PROPERTIES(${API_TEST} PROPERTIES TIMEOUT 120)
|
||||||
ENDFOREACH(API_TEST)
|
ENDFOREACH(API_TEST)
|
||||||
|
|
||||||
|
FOREACH(API_TEST ${MANUAL_TESTS})
|
||||||
|
ADD_EXECUTABLE(${API_TEST} ${API_TEST}.c ${CMAKE_SOURCE_DIR}/libmariadb/getopt.c)
|
||||||
|
TARGET_LINK_LIBRARIES(${API_TEST} mytap libmariadb)
|
||||||
|
ENDFOREACH()
|
||||||
|
@@ -2,12 +2,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "my_test.h"
|
#include "my_test.h"
|
||||||
|
#include "ma_pvio.h"
|
||||||
|
|
||||||
static int aurora1(MYSQL *mysql)
|
static int aurora1(MYSQL *mysql)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
my_bool read_only= 1;
|
my_bool read_only= 1;
|
||||||
char *primary, *replica;
|
const char *primary, *schema;
|
||||||
MYSQL_RES *res;
|
MYSQL_RES *res;
|
||||||
|
|
||||||
rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
|
rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
|
||||||
@@ -19,7 +20,7 @@ static int aurora1(MYSQL *mysql)
|
|||||||
rc= mysql_query(mysql, "INSERT INTO t1 VALUES (1, 'foo'), (2, 'bar')");
|
rc= mysql_query(mysql, "INSERT INTO t1 VALUES (1, 'foo'), (2, 'bar')");
|
||||||
check_mysql_rc(rc, mysql);
|
check_mysql_rc(rc, mysql);
|
||||||
|
|
||||||
primary= mysql->host;
|
mariadb_get_infov(mysql, MARIADB_CONNECTION_HOST, &primary);
|
||||||
diag("primary: %s", primary);
|
diag("primary: %s", primary);
|
||||||
|
|
||||||
mysql_options(mysql, MARIADB_OPT_CONNECTION_READ_ONLY, &read_only);
|
mysql_options(mysql, MARIADB_OPT_CONNECTION_READ_ONLY, &read_only);
|
||||||
@@ -37,15 +38,29 @@ static int aurora1(MYSQL *mysql)
|
|||||||
diag("Num_rows: %d", mysql_num_rows(res));
|
diag("Num_rows: %d", mysql_num_rows(res));
|
||||||
mysql_free_result(res);
|
mysql_free_result(res);
|
||||||
|
|
||||||
replica= mysql->host;
|
mariadb_get_infov(mysql, MARIADB_CONNECTION_SCHEMA, &schema);
|
||||||
diag("replica: %s", replica);
|
diag("db: %s", schema);
|
||||||
diag("db: %s", mysql->db);
|
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int test_wrong_user(MYSQL *my)
|
||||||
|
{
|
||||||
|
MYSQL *mysql= mysql_init(NULL);
|
||||||
|
|
||||||
|
if (mysql_real_connect(mysql, hostname, "wrong_user", NULL, NULL, 0, NULL, 0))
|
||||||
|
{
|
||||||
|
diag("Error expected");
|
||||||
|
mysql_close(mysql);
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
mysql_close(mysql);
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
struct my_tests_st my_tests[] = {
|
struct my_tests_st my_tests[] = {
|
||||||
{"aurora1", aurora1, TEST_CONNECTION_NEW, 0, NULL, NULL},
|
{"aurora1", aurora1, TEST_CONNECTION_NEW, 0, NULL, NULL},
|
||||||
|
{"test_wrong_user", test_wrong_user, TEST_CONNECTION_NONE, 0, NULL, NULL},
|
||||||
{NULL, NULL, 0, 0, NULL, NULL}
|
{NULL, NULL, 0, 0, NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user