Change server version from char pointer to char array

With this change, it is no longer possible that the server version
is deallocated at the very moment it is read. There is still a race,
but it's mostly harmless.
This commit is contained in:
Johan Wikman
2017-06-19 13:40:18 +03:00
parent 32cd28daf2
commit 3e39ec906e
4 changed files with 39 additions and 42 deletions

View File

@ -522,14 +522,14 @@ static bool check_server_permissions(SERVICE *service, SERVER* server,
mysql_get_character_set_info(mysql, &cs_info);
server->charset = cs_info.number;
if (server->server_string == NULL)
if (server->version_string[0] == 0)
{
const char *server_string = mysql_get_server_info(mysql);
server_set_version_string(server, server_string);
const char *version_string = mysql_get_server_info(mysql);
server_set_version_string(server, version_string);
}
const char *template = "SELECT user, host, %s, Select_priv FROM mysql.user limit 1";
const char* query_pw = strstr(server->server_string, "5.7.") ?
const char* query_pw = strstr(server->version_string, "5.7.") ?
MYSQL57_PASSWORD : MYSQL_PASSWORD;
char query[strlen(template) + strlen(query_pw) + 1];
bool rval = true;
@ -726,18 +726,15 @@ void commit_sqlite_transaction(sqlite3 *handle)
}
}
int get_users_from_server(MYSQL *con, SERVER_REF *server, SERVICE *service, SERV_LISTENER *listener)
int get_users_from_server(MYSQL *con, SERVER_REF *server_ref, SERVICE *service, SERV_LISTENER *listener)
{
if (server->server->server_string == NULL)
if (server_ref->server->version_string[0] == 0)
{
const char *server_string = mysql_get_server_info(con);
if (!server_set_version_string(server->server, server_string))
{
return -1;
}
const char *version_string = mysql_get_server_info(con);
server_set_version_string(server_ref->server, version_string);
}
char *query = get_new_users_query(server->server->server_string, service->enable_root);
char *query = get_new_users_query(server_ref->server->version_string, service->enable_root);
MYSQL_AUTH *instance = (MYSQL_AUTH*)listener->auth_instance;
bool anon_user = false;
int users = 0;