summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <antony@pcg5ppc.xiphis.org>2007-11-01 12:30:03 -0700
committerunknown <antony@pcg5ppc.xiphis.org>2007-11-01 12:30:03 -0700
commitaea5007d641042fb2ee4476663367893ee960480 (patch)
treeae4cb5021c4e27168b609e8f3fb877d3fed73189
parentbe9e52135fc76fca8018ae67a915f5ba0a1fbb08 (diff)
downloadmariadb-git-aea5007d641042fb2ee4476663367893ee960480.tar.gz
Bug#30671
"ALTER SERVER can cause server to crash" While retrieving values, it would erronously set the socket value to NULL and attempt to use it in strcmp(). Ensure it is correctly set to "" so that strcmp may not crash. mysql-test/r/federated_server.result: results for bug30671 fix inconsistent result mysql-test/t/federated_server.test: surplus semicolon test for bug30671 sql/sql_servers.cc: bug30671 inside function get_server_from_table_to_cache() server->socket was being set to NULL instead of empty string
-rw-r--r--mysql-test/r/federated_server.result10
-rw-r--r--mysql-test/t/federated_server.test14
-rw-r--r--sql/sql_servers.cc4
3 files changed, 24 insertions, 4 deletions
diff --git a/mysql-test/r/federated_server.result b/mysql-test/r/federated_server.result
index 0905aabb075..32717b4f0e3 100644
--- a/mysql-test/r/federated_server.result
+++ b/mysql-test/r/federated_server.result
@@ -253,6 +253,14 @@ drop user guest_usage@localhost;
drop user guest_select@localhost;
drop table federated.t1;
drop server 's1';
+create server 's1' foreign data wrapper 'mysql' options (port 3306);
+alter server 's1' options
+(host 'localhost', database '', user '',
+password '', socket '', owner '', port 3306);
+alter server 's1' options
+(host 'localhost', database 'database1', user '',
+password '', socket '', owner '', port 3306);
+drop server 's1';
# End of 5.1 tests
use test;
create procedure p1 ()
@@ -262,7 +270,7 @@ DECLARE e INT DEFAULT 0;
DECLARE i INT;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET e = e + 1;
SET i = sleep(5);
-WHILE v < 20000 do
+WHILE v < 10000 do
CREATE SERVER s
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'Remote', HOST '192.168.1.106', DATABASE 'test');
diff --git a/mysql-test/t/federated_server.test b/mysql-test/t/federated_server.test
index 87b67720104..444285ac045 100644
--- a/mysql-test/t/federated_server.test
+++ b/mysql-test/t/federated_server.test
@@ -2,7 +2,7 @@
# if federated can utilise the servers table
# should work with embedded server after mysqltest is fixed
-- source include/not_embedded.inc
--- source include/federated.inc;
+-- source include/federated.inc
-- source include/big_test.inc
connection slave;
@@ -282,6 +282,18 @@ drop user guest_select@localhost;
drop table federated.t1;
drop server 's1';
+#
+# Bug#30671 - ALTER SERVER causes the server to crash
+#
+create server 's1' foreign data wrapper 'mysql' options (port 3306);
+alter server 's1' options
+ (host 'localhost', database '', user '',
+ password '', socket '', owner '', port 3306);
+# The next statement would crash unpatched server
+alter server 's1' options
+ (host 'localhost', database 'database1', user '',
+ password '', socket '', owner '', port 3306);
+drop server 's1';
--echo # End of 5.1 tests
diff --git a/sql/sql_servers.cc b/sql/sql_servers.cc
index a780c561ffe..543884fdfa6 100644
--- a/sql/sql_servers.cc
+++ b/sql/sql_servers.cc
@@ -289,7 +289,7 @@ get_server_from_table_to_cache(TABLE *table)
{
/* alloc a server struct */
char *ptr;
- char *blank= (char*)"";
+ char * const blank= (char*)"";
FOREIGN_SERVER *server= (FOREIGN_SERVER *)alloc_root(&mem,
sizeof(FOREIGN_SERVER));
DBUG_ENTER("get_server_from_table_to_cache");
@@ -312,7 +312,7 @@ get_server_from_table_to_cache(TABLE *table)
server->port= server->sport ? atoi(server->sport) : 0;
ptr= get_field(&mem, table->field[6]);
- server->socket= ptr && strlen(ptr) ? ptr : NULL;
+ server->socket= ptr && strlen(ptr) ? ptr : blank;
ptr= get_field(&mem, table->field[7]);
server->scheme= ptr ? ptr : blank;
ptr= get_field(&mem, table->field[8]);