summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <msvensson@neptunus.(none)>2006-05-11 14:13:14 +0200
committerunknown <msvensson@neptunus.(none)>2006-05-11 14:13:14 +0200
commita9e0d2779e16bfd33292accfd3e417713381bd5c (patch)
treed7d75583e99a84dfb79f42ef1fcfd56c41521b58
parent5854f65b29c91479515b186fae73d1a85169600d (diff)
downloadmariadb-git-a9e0d2779e16bfd33292accfd3e417713381bd5c.tar.gz
Bug#15328 Segmentation fault occured if my.cnf is invalid for escape sequence
- Check that length of value is longer than 1 before decrementing length by 2. - Backport from 5.0, make it possible to use my_print_defaults in tests mysql-test/mysql-test-run.pl: Backport from 5.0, make it possible to use my_print_defaults from tests mysql-test/mysql-test-run.sh: Backport from 5.0, make it possible to use my_print_defaults from tests mysql-test/r/mysqldump.result: Update result mysql-test/t/mysqldump.test: Test that my_print default don't segfault when encountering an option without closing " mysys/default.c: Check that length of value is longer than 1 before deciding to decrement its length by 2. mysql-test/std_data/bug15328.cnf: New BitKeeper file ``mysql-test/std_data/bug15328.cnf''
-rwxr-xr-xmysql-test/mysql-test-run.pl8
-rw-r--r--mysql-test/mysql-test-run.sh4
-rw-r--r--mysql-test/r/mysqldump.result1
-rw-r--r--mysql-test/std_data/bug15328.cnf2
-rw-r--r--mysql-test/t/mysqldump.test8
-rw-r--r--mysys/default.c4
6 files changed, 25 insertions, 2 deletions
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index 121102ec262..6f2ae296122 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -179,6 +179,7 @@ our $exe_mysqlshow; # Called from test case
our $exe_mysql_fix_system_tables;
our $exe_mysqltest;
our $exe_slave_mysqld;
+our $exe_my_print_defaults;
our $opt_bench= 0;
our $opt_small_bench= 0;
@@ -893,6 +894,8 @@ sub executable_setup () {
"$path_client_bindir/mysqld-max");
$path_language= mtr_path_exists("$glob_basedir/share/english/");
$path_charsetsdir= mtr_path_exists("$glob_basedir/share/charsets");
+ $exe_my_print_defaults=
+ mtr_exe_exists("$path_client_bindir/my_print_defaults");
}
else
{
@@ -900,6 +903,8 @@ sub executable_setup () {
$exe_mysqld= mtr_exe_exists ("$glob_basedir/sql/mysqld");
$path_language= mtr_path_exists("$glob_basedir/sql/share/english/");
$path_charsetsdir= mtr_path_exists("$glob_basedir/sql/share/charsets");
+ $exe_my_print_defaults=
+ mtr_exe_exists("$glob_basedir/extra/my_print_defaults");
}
if ( $glob_use_embedded_server )
@@ -952,6 +957,8 @@ sub executable_setup () {
$exe_mysql_fix_system_tables=
mtr_script_exists("$path_client_bindir/mysql_fix_privilege_tables",
"$glob_basedir/scripts/mysql_fix_privilege_tables");
+ $exe_my_print_defaults=
+ mtr_exe_exists("$path_client_bindir/my_print_defaults");
$path_language= mtr_path_exists("$glob_basedir/share/mysql/english/",
"$glob_basedir/share/english/");
@@ -2303,6 +2310,7 @@ sub run_mysqltest ($) {
$ENV{'MYSQL_FIX_SYSTEM_TABLES'}= $cmdline_mysql_fix_system_tables;
$ENV{'MYSQL_CLIENT_TEST'}= $cmdline_mysql_client_test;
$ENV{'CHARSETSDIR'}= $path_charsetsdir;
+ $ENV{'MYSQL_MY_PRINT_DEFAULTS'}= $exe_my_print_defaults;
$ENV{'NDB_STATUS_OK'}= $flag_ndb_status_ok;
$ENV{'NDB_MGM'}= $exe_ndb_mgm;
diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh
index c8d54d7e86c..a784149c7d0 100644
--- a/mysql-test/mysql-test-run.sh
+++ b/mysql-test/mysql-test-run.sh
@@ -601,6 +601,7 @@ if [ x$SOURCE_DIST = x1 ] ; then
CLIENT_BINDIR="$BASEDIR/client"
MYSQLADMIN="$CLIENT_BINDIR/mysqladmin"
WAIT_PID="$BASEDIR/extra/mysql_waitpid"
+ MYSQL_MY_PRINT_DEFAULTS="$BASEDIR/extra/my_print_defaults"
MYSQL_MANAGER_CLIENT="$CLIENT_BINDIR/mysqlmanagerc"
MYSQL_MANAGER="$BASEDIR/tools/mysqlmanager"
MYSQL_MANAGER_PWGEN="$CLIENT_BINDIR/mysqlmanager-pwgen"
@@ -661,6 +662,7 @@ else
MYSQL_BINLOG="$CLIENT_BINDIR/mysqlbinlog"
MYSQLADMIN="$CLIENT_BINDIR/mysqladmin"
WAIT_PID="$CLIENT_BINDIR/mysql_waitpid"
+ MYSQL_MY_PRINT_DEFAULTS="$CLIENT_BINDIR/my_print_defaults"
MYSQL_MANAGER="$CLIENT_BINDIR/mysqlmanager"
MYSQL_MANAGER_CLIENT="$CLIENT_BINDIR/mysqlmanagerc"
MYSQL_MANAGER_PWGEN="$CLIENT_BINDIR/mysqlmanager-pwgen"
@@ -742,7 +744,7 @@ MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR $EXTRA_MYS
MYSQL_FIX_SYSTEM_TABLES="$MYSQL_FIX_SYSTEM_TABLES --no-defaults --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=$DBPASSWD --basedir=$BASEDIR --bindir=$CLIENT_BINDIR --verbose"
MYSQL="$MYSQL --no-defaults --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=$DBPASSWD"
export MYSQL MYSQL_DUMP MYSQL_IMPORT MYSQL_BINLOG MYSQL_FIX_SYSTEM_TABLES
-export CLIENT_BINDIR MYSQL_CLIENT_TEST CHARSETSDIR
+export CLIENT_BINDIR MYSQL_CLIENT_TEST CHARSETSDIR MYSQL_MY_PRINT_DEFAULTS
export NDB_TOOLS_DIR
export NDB_MGM
export NDB_BACKUP_DIR
diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result
index fb72abe9b45..2fc5963bea5 100644
--- a/mysql-test/r/mysqldump.result
+++ b/mysql-test/r/mysqldump.result
@@ -1503,3 +1503,4 @@ select * from t1;
a b
Osnabrück Köln
drop table t1;
+--fields-optionally-enclosed-by="
diff --git a/mysql-test/std_data/bug15328.cnf b/mysql-test/std_data/bug15328.cnf
new file mode 100644
index 00000000000..e23d33bfa54
--- /dev/null
+++ b/mysql-test/std_data/bug15328.cnf
@@ -0,0 +1,2 @@
+[mysqldump]
+fields-optionally-enclosed-by="
diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test
index ad1fb534836..190c6739940 100644
--- a/mysql-test/t/mysqldump.test
+++ b/mysql-test/t/mysqldump.test
@@ -647,4 +647,12 @@ select * from t1;
select * from t1;
drop table t1;
+
+#
+# BUG#15328 Segmentation fault occured if my.cnf is invalid for escape sequence
+#
+
+--exec $MYSQL_MY_PRINT_DEFAULTS --defaults-extra-file=$MYSQL_TEST_DIR/std_data/bug15328.cnf mysqldump
+
+
# End of 4.1 tests
diff --git a/mysys/default.c b/mysys/default.c
index 9510cfb3464..6e40c48d82a 100644
--- a/mysys/default.c
+++ b/mysys/default.c
@@ -579,7 +579,9 @@ static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc,
value_end=value;
/* remove quotes around argument */
- if ((*value == '\"' || *value == '\'') && *value == value_end[-1])
+ if ((*value == '\"' || *value == '\'') && /* First char is quote */
+ (value + 1 < value_end ) && /* String is longer than 1 */
+ *value == value_end[-1] ) /* First char is equal to last char */
{
value++;
value_end--;