Loading libmysql/libmysql.c +5 −8 Original line number Diff line number Diff line Loading @@ -4522,14 +4522,11 @@ my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt) { MYSQL *mysql= stmt->mysql; if (result->data) { /* Result buffered */ free_root(&result->alloc, MYF(MY_KEEP_PREALLOC)); result->data= NULL; result->rows= 0; stmt->data_cursor= NULL; } if (mysql && stmt->field_count && (int) stmt->state > (int) MYSQL_STMT_PREPARE_DONE) Loading libmysqld/lib_sql.cc +1 −1 Original line number Diff line number Diff line Loading @@ -668,7 +668,7 @@ bool Protocol::send_fields(List<Item> *list, uint flag) DBUG_RETURN(0); field_count= list->elements; field_alloc= thd->current_stmt ? &thd->current_stmt->mem_root : field_alloc= thd->current_stmt ? &thd->current_stmt->result.alloc : &mysql->field_alloc; if (!(client_field= mysql->fields= (MYSQL_FIELD *)alloc_root(field_alloc, Loading mysql-test/r/symlink.result +21 −17 Original line number Diff line number Diff line Loading @@ -91,23 +91,15 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; CREATE TABLE t1(a INT) DATA DIRECTORY='TEST_DIR/master-data/mysql' INDEX DIRECTORY='TEST_DIR/master-data/mysql'; RENAME TABLE t1 TO user; ERROR HY000: Can't create/write to file 'TEST_DIR/master-data/mysql/user.MYI' (Errcode: 17) DROP TABLE t1; show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `i` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `i` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; DATA DIRECTORY='TEST_DIR/tmp' INDEX DIRECTORY='TEST_DIR/tmp'; ERROR HY000: Can't create/write to file 'TEST_DIR/tmp/t1.MYI' (Errcode: 17) CREATE TABLE t2(a INT) DATA DIRECTORY='TEST_DIR/tmp' INDEX DIRECTORY='TEST_DIR/tmp'; RENAME TABLE t2 TO t1; ERROR HY000: Can't create/write to file 'TEST_DIR/tmp/t1.MYI' (Errcode: 17) DROP TABLE t2; show create table t1; Table Create Table t1 CREATE TEMPORARY TABLE `t1` ( Loading Loading @@ -144,4 +136,16 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/tmp/' drop table t1; deallocate prepare stmt; CREATE TABLE t1(a INT) DATA DIRECTORY='TEST_DIR/var/master-data/test'; ERROR HY000: Incorrect arguments to DATA DIRECORY CREATE TABLE t1(a INT) DATA DIRECTORY='TEST_DIR/var/master-data/'; ERROR HY000: Incorrect arguments to DATA DIRECORY CREATE TABLE t1(a INT) INDEX DIRECTORY='TEST_DIR/var/master-data'; ERROR HY000: Incorrect arguments to INDEX DIRECORY CREATE TABLE t1(a INT) INDEX DIRECTORY='TEST_DIR/var/master-data_var'; ERROR HY000: Can't create/write to file 'TEST_DIR/var/master-data_var/t1.MYI' (Errcode: 2) End of 4.1 tests mysql-test/t/symlink.test +32 −19 Original line number Diff line number Diff line Loading @@ -121,29 +121,22 @@ drop table t1; # # BUG#32111 - Security Breach via DATA/INDEX DIRECORY and RENAME TABLE # --write_file $MYSQLTEST_VARDIR/tmp/t1.MYI EOF --replace_result $MYSQLTEST_VARDIR TEST_DIR --error 1 eval CREATE TABLE t1(a INT) DATA DIRECTORY='$MYSQLTEST_VARDIR/master-data/mysql' INDEX DIRECTORY='$MYSQLTEST_VARDIR/master-data/mysql'; DATA DIRECTORY='$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY='$MYSQLTEST_VARDIR/tmp'; --replace_result $MYSQLTEST_VARDIR TEST_DIR eval CREATE TABLE t2(a INT) DATA DIRECTORY='$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY='$MYSQLTEST_VARDIR/tmp'; --replace_result $MYSQLTEST_VARDIR TEST_DIR --error 1 RENAME TABLE t1 TO user; DROP TABLE t1; # # Test specifying DATA DIRECTORY that is the same as what would normally # have been chosen. (Bug #8707) # disable_query_log; eval create table t1 (i int) data directory = "$MYSQL_TEST_DIR/var/master-data/test/"; enable_query_log; show create table t1; drop table t1; disable_query_log; eval create table t1 (i int) index directory = "$MYSQL_TEST_DIR/var/master-data/test/"; enable_query_log; show create table t1; drop table t1; RENAME TABLE t2 TO t1; DROP TABLE t2; --remove_file $MYSQLTEST_VARDIR/tmp/t1.MYI # # Bug#8706 - temporary table with data directory option fails Loading Loading @@ -201,4 +194,24 @@ show create table t1; drop table t1; deallocate prepare stmt; # # Bug#32167 another privilege bypass with DATA/INDEX DIRECORY # --replace_result $MYSQL_TEST_DIR TEST_DIR --error 1210 eval CREATE TABLE t1(a INT) DATA DIRECTORY='$MYSQL_TEST_DIR/var/master-data/test'; --replace_result $MYSQL_TEST_DIR TEST_DIR --error 1210 eval CREATE TABLE t1(a INT) DATA DIRECTORY='$MYSQL_TEST_DIR/var/master-data/'; --replace_result $MYSQL_TEST_DIR TEST_DIR --error 1210 eval CREATE TABLE t1(a INT) INDEX DIRECTORY='$MYSQL_TEST_DIR/var/master-data'; --replace_result $MYSQL_TEST_DIR TEST_DIR --error 1 eval CREATE TABLE t1(a INT) INDEX DIRECTORY='$MYSQL_TEST_DIR/var/master-data_var'; --echo End of 4.1 tests sql/mysql_priv.h +1 −0 Original line number Diff line number Diff line Loading @@ -890,6 +890,7 @@ void my_dbopt_free(void); extern time_t start_time; extern char *mysql_data_home,server_version[SERVER_VERSION_LENGTH], mysql_real_data_home[], *opt_mysql_tmpdir, mysql_charsets_dir[], mysql_unpacked_real_data_home[], def_ft_boolean_syntax[sizeof(ft_boolean_syntax)]; #define mysql_tmpdir (my_tmpdir(&mysql_tmpdir_list)) extern MY_TMPDIR mysql_tmpdir_list; Loading Loading
libmysql/libmysql.c +5 −8 Original line number Diff line number Diff line Loading @@ -4522,14 +4522,11 @@ my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt) { MYSQL *mysql= stmt->mysql; if (result->data) { /* Result buffered */ free_root(&result->alloc, MYF(MY_KEEP_PREALLOC)); result->data= NULL; result->rows= 0; stmt->data_cursor= NULL; } if (mysql && stmt->field_count && (int) stmt->state > (int) MYSQL_STMT_PREPARE_DONE) Loading
libmysqld/lib_sql.cc +1 −1 Original line number Diff line number Diff line Loading @@ -668,7 +668,7 @@ bool Protocol::send_fields(List<Item> *list, uint flag) DBUG_RETURN(0); field_count= list->elements; field_alloc= thd->current_stmt ? &thd->current_stmt->mem_root : field_alloc= thd->current_stmt ? &thd->current_stmt->result.alloc : &mysql->field_alloc; if (!(client_field= mysql->fields= (MYSQL_FIELD *)alloc_root(field_alloc, Loading
mysql-test/r/symlink.result +21 −17 Original line number Diff line number Diff line Loading @@ -91,23 +91,15 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; CREATE TABLE t1(a INT) DATA DIRECTORY='TEST_DIR/master-data/mysql' INDEX DIRECTORY='TEST_DIR/master-data/mysql'; RENAME TABLE t1 TO user; ERROR HY000: Can't create/write to file 'TEST_DIR/master-data/mysql/user.MYI' (Errcode: 17) DROP TABLE t1; show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `i` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `i` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; DATA DIRECTORY='TEST_DIR/tmp' INDEX DIRECTORY='TEST_DIR/tmp'; ERROR HY000: Can't create/write to file 'TEST_DIR/tmp/t1.MYI' (Errcode: 17) CREATE TABLE t2(a INT) DATA DIRECTORY='TEST_DIR/tmp' INDEX DIRECTORY='TEST_DIR/tmp'; RENAME TABLE t2 TO t1; ERROR HY000: Can't create/write to file 'TEST_DIR/tmp/t1.MYI' (Errcode: 17) DROP TABLE t2; show create table t1; Table Create Table t1 CREATE TEMPORARY TABLE `t1` ( Loading Loading @@ -144,4 +136,16 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/tmp/' drop table t1; deallocate prepare stmt; CREATE TABLE t1(a INT) DATA DIRECTORY='TEST_DIR/var/master-data/test'; ERROR HY000: Incorrect arguments to DATA DIRECORY CREATE TABLE t1(a INT) DATA DIRECTORY='TEST_DIR/var/master-data/'; ERROR HY000: Incorrect arguments to DATA DIRECORY CREATE TABLE t1(a INT) INDEX DIRECTORY='TEST_DIR/var/master-data'; ERROR HY000: Incorrect arguments to INDEX DIRECORY CREATE TABLE t1(a INT) INDEX DIRECTORY='TEST_DIR/var/master-data_var'; ERROR HY000: Can't create/write to file 'TEST_DIR/var/master-data_var/t1.MYI' (Errcode: 2) End of 4.1 tests
mysql-test/t/symlink.test +32 −19 Original line number Diff line number Diff line Loading @@ -121,29 +121,22 @@ drop table t1; # # BUG#32111 - Security Breach via DATA/INDEX DIRECORY and RENAME TABLE # --write_file $MYSQLTEST_VARDIR/tmp/t1.MYI EOF --replace_result $MYSQLTEST_VARDIR TEST_DIR --error 1 eval CREATE TABLE t1(a INT) DATA DIRECTORY='$MYSQLTEST_VARDIR/master-data/mysql' INDEX DIRECTORY='$MYSQLTEST_VARDIR/master-data/mysql'; DATA DIRECTORY='$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY='$MYSQLTEST_VARDIR/tmp'; --replace_result $MYSQLTEST_VARDIR TEST_DIR eval CREATE TABLE t2(a INT) DATA DIRECTORY='$MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY='$MYSQLTEST_VARDIR/tmp'; --replace_result $MYSQLTEST_VARDIR TEST_DIR --error 1 RENAME TABLE t1 TO user; DROP TABLE t1; # # Test specifying DATA DIRECTORY that is the same as what would normally # have been chosen. (Bug #8707) # disable_query_log; eval create table t1 (i int) data directory = "$MYSQL_TEST_DIR/var/master-data/test/"; enable_query_log; show create table t1; drop table t1; disable_query_log; eval create table t1 (i int) index directory = "$MYSQL_TEST_DIR/var/master-data/test/"; enable_query_log; show create table t1; drop table t1; RENAME TABLE t2 TO t1; DROP TABLE t2; --remove_file $MYSQLTEST_VARDIR/tmp/t1.MYI # # Bug#8706 - temporary table with data directory option fails Loading Loading @@ -201,4 +194,24 @@ show create table t1; drop table t1; deallocate prepare stmt; # # Bug#32167 another privilege bypass with DATA/INDEX DIRECORY # --replace_result $MYSQL_TEST_DIR TEST_DIR --error 1210 eval CREATE TABLE t1(a INT) DATA DIRECTORY='$MYSQL_TEST_DIR/var/master-data/test'; --replace_result $MYSQL_TEST_DIR TEST_DIR --error 1210 eval CREATE TABLE t1(a INT) DATA DIRECTORY='$MYSQL_TEST_DIR/var/master-data/'; --replace_result $MYSQL_TEST_DIR TEST_DIR --error 1210 eval CREATE TABLE t1(a INT) INDEX DIRECTORY='$MYSQL_TEST_DIR/var/master-data'; --replace_result $MYSQL_TEST_DIR TEST_DIR --error 1 eval CREATE TABLE t1(a INT) INDEX DIRECTORY='$MYSQL_TEST_DIR/var/master-data_var'; --echo End of 4.1 tests
sql/mysql_priv.h +1 −0 Original line number Diff line number Diff line Loading @@ -890,6 +890,7 @@ void my_dbopt_free(void); extern time_t start_time; extern char *mysql_data_home,server_version[SERVER_VERSION_LENGTH], mysql_real_data_home[], *opt_mysql_tmpdir, mysql_charsets_dir[], mysql_unpacked_real_data_home[], def_ft_boolean_syntax[sizeof(ft_boolean_syntax)]; #define mysql_tmpdir (my_tmpdir(&mysql_tmpdir_list)) extern MY_TMPDIR mysql_tmpdir_list; Loading