MXS-1977: Fix protocol and readwritesplit memory leaks

The protocol could leak memory in rare cases where several commands were
queued at the same time. Readwritesplit also didn't free the memory it
acquired via qc_get_table_names.
This commit is contained in:
Markus Mäkelä 2018-07-16 05:53:44 +03:00
parent 9b1d1303ce
commit 4fb4ed416b
No known key found for this signature in database
GPG Key ID: 72D48FCE664F7B19
2 changed files with 24 additions and 15 deletions

View File

@ -637,8 +637,9 @@ void protocol_remove_srv_command(MySQLProtocol* p)
}
else
{
p->protocol_command = *(s->scom_next);
server_command_t tmp = *(s->scom_next);
MXS_FREE(s->scom_next);
p->protocol_command = tmp;
}
}

View File

@ -51,24 +51,32 @@ static bool foreach_table(RWSplitSession* rses, GWBUF* querybuf, bool (*func)(RW
int n_tables;
char** tables = qc_get_table_names(querybuf, &n_tables, true);
for (int i = 0; i < n_tables; i++)
if (tables)
{
const char* db = mxs_mysql_get_current_db(rses->client_dcb->session);
std::string table;
if (strchr(tables[i], '.') == NULL)
for (int i = 0; i < n_tables; i++)
{
table += db;
table += ".";
if (rval)
{
const char* db = mxs_mysql_get_current_db(rses->client_dcb->session);
std::string table;
if (strchr(tables[i], '.') == NULL)
{
table += db;
table += ".";
}
table += tables[i];
if (!func(rses, table))
{
rval = false;
}
}
MXS_FREE(tables[i]);
}
table += tables[i];
if (!func(rses, table))
{
rval = false;
break;
}
MXS_FREE(tables);
}
return rval;