Commit 5ad505dd authored by unknown's avatar unknown

BUG#35509 - Federated leaks memory when connecting to

            localhost/default port

When creating federated table that points to unspecified host or
localhost on unspecified port or port is 0, small memory leak occurs.

This happens because we make a copy of unix socket path, which is
never freed.

With this fix we do not make a copy of unix socket path, instead
share->socket points to MYSQL_UNIX_ADDR constant directly.

This fix is covered by a test case for BUG34788.

Affects 5.0 only.


mysql-test/t/federated.test:
  A test case for BUG#35509.
sql/ha_federated.cc:
  When creating federated table we call parse_url() to check if connect
  string is correct. parse_url() may make a copy of unix socket path if
  port is not specified or 0 and host is not specified or 'localhost'.
  This copy is never freed.
  
  As there is no need to make a copy of unix socket path, let
  share->socket point to MYSQL_UNIX_ADDR directly.
parent 8030bdfc
...@@ -1742,6 +1742,11 @@ DROP TABLE t1; ...@@ -1742,6 +1742,11 @@ DROP TABLE t1;
# BUG#34788 - malformed federated connection url is not handled correctly - # BUG#34788 - malformed federated connection url is not handled correctly -
# crashes server ! # crashes server !
# #
# also tests
#
# BUG#35509 - Federated leaks memory when connecting to localhost/default
# port
#
CREATE TABLE t1 (a INT) ENGINE=federated CONNECTION='mysql://@:://'; CREATE TABLE t1 (a INT) ENGINE=federated CONNECTION='mysql://@:://';
DROP TABLE t1; DROP TABLE t1;
......
...@@ -656,7 +656,7 @@ static int parse_url(FEDERATED_SHARE *share, TABLE *table, ...@@ -656,7 +656,7 @@ static int parse_url(FEDERATED_SHARE *share, TABLE *table,
if (!share->port) if (!share->port)
{ {
if (!share->hostname || strcmp(share->hostname, my_localhost) == 0) if (!share->hostname || strcmp(share->hostname, my_localhost) == 0)
share->socket= my_strdup(MYSQL_UNIX_ADDR, MYF(0)); share->socket= (char*) MYSQL_UNIX_ADDR;
else else
share->port= MYSQL_PORT; share->port= MYSQL_PORT;
} }
...@@ -1342,7 +1342,6 @@ static int free_share(FEDERATED_SHARE *share) ...@@ -1342,7 +1342,6 @@ static int free_share(FEDERATED_SHARE *share)
{ {
hash_delete(&federated_open_tables, (byte*) share); hash_delete(&federated_open_tables, (byte*) share);
my_free((gptr) share->scheme, MYF(MY_ALLOW_ZERO_PTR)); my_free((gptr) share->scheme, MYF(MY_ALLOW_ZERO_PTR));
my_free((gptr) share->socket, MYF(MY_ALLOW_ZERO_PTR));
thr_lock_delete(&share->lock); thr_lock_delete(&share->lock);
VOID(pthread_mutex_destroy(&share->mutex)); VOID(pthread_mutex_destroy(&share->mutex));
my_free((gptr) share, MYF(0)); my_free((gptr) share, MYF(0));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment