Below is the list of changes that have just been committed into a local
5.1 repository of antony. When antony does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-11-01 12:30:03-07:00, antony@stripped +3 -0
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@stripped, 2007-11-01 12:29:59-07:00, antony@stripped +9 -1
results for bug30671
fix inconsistent result
mysql-test/t/federated_server.test@stripped, 2007-11-01 12:29:59-07:00, antony@stripped +13 -1
surplus semicolon
test for bug30671
sql/sql_servers.cc@stripped, 2007-11-01 12:29:59-07:00, antony@stripped +2 -2
bug30671
inside function get_server_from_table_to_cache()
server->socket was being set to NULL instead of empty string
diff -Nrup a/mysql-test/r/federated_server.result b/mysql-test/r/federated_server.result
--- a/mysql-test/r/federated_server.result 2007-04-04 14:35:54 -07:00
+++ b/mysql-test/r/federated_server.result 2007-11-01 12:29:59 -07:00
@@ -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 -Nrup a/mysql-test/t/federated_server.test b/mysql-test/t/federated_server.test
--- a/mysql-test/t/federated_server.test 2007-04-17 04:41:14 -07:00
+++ b/mysql-test/t/federated_server.test 2007-11-01 12:29:59 -07:00
@@ -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 -Nrup a/sql/sql_servers.cc b/sql/sql_servers.cc
--- a/sql/sql_servers.cc 2007-08-13 06:11:14 -07:00
+++ b/sql/sql_servers.cc 2007-11-01 12:29:59 -07:00
@@ -289,7 +289,7 @@ get_server_from_table_to_cache(TABLE *ta
{
/* 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 *ta
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]);