From a7889e5bb062e7b8ddd2da38fbecbd2c392312cc Mon Sep 17 00:00:00 2001 From: "monty@mashka.mysql.fi" <> Date: Sun, 9 Mar 2003 17:13:37 +0200 Subject: [PATCH 1/7] Changed --debug to append to test instead of creating new trace files. (This patch is already in 4.0) --- mysql-test/mysql-test-run.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 8b1c8ff1b44..faa49969a23 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -220,9 +220,9 @@ while test $# -gt 0; do ;; --debug) EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT \ - --debug=d:t:i:O,$MYSQL_TEST_DIR/var/log/master.trace" + --debug=d:t:i:A,$MYSQL_TEST_DIR/var/log/master.trace" EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT \ - --debug=d:t:i:O,$MYSQL_TEST_DIR/var/log/slave.trace" + --debug=d:t:i:A,$MYSQL_TEST_DIR/var/log/slave.trace" EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT --debug" ;; -- ) shift; break ;; From 357766eca8c0724d4552f503683cf8adb923210b Mon Sep 17 00:00:00 2001 From: "serg@serg.mysql.com" <> Date: Mon, 10 Mar 2003 12:31:49 +0100 Subject: [PATCH 2/7] ignore world-writeable my.cnf's --- mysys/default.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/mysys/default.c b/mysys/default.c index 062711b185d..c9b0704216a 100644 --- a/mysys/default.c +++ b/mysys/default.c @@ -39,6 +39,7 @@ #include "mysys_priv.h" #include "m_string.h" #include "m_ctype.h" +#include char *defaults_extra_file=0; @@ -60,13 +61,13 @@ DATADIR, NullS, }; -#define default_ext ".cnf" /* extension for config file */ +#define default_ext ".cnf" /* extension for config file */ #ifdef __WIN__ #include #define windows_ext ".ini" #endif -static my_bool search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, +static my_bool search_default_file(DYNAMIC_ARRAY *args,MEM_ROOT *alloc, const char *dir, const char *config_file, const char *ext, TYPELIB *group); @@ -241,6 +242,16 @@ static my_bool search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, { strmov(name,config_file); } + fn_format(name,name,"","",4); +#if !defined(__WIN__) && !defined(OS2) + { + MY_STAT stat_info; + if (!my_stat(name,&stat_info,MYF(MY_WME))) + return 0; + if (stat_info.st_mode & S_IWOTH) /* ignore world-writeable files */ + return 0; + } +#endif if (!(fp = my_fopen(fn_format(name,name,"","",4),O_RDONLY,MYF(0)))) return 0; /* Ignore wrong files */ From 4b402e6d4657e31ef0663a8c60f680fb2bf053a7 Mon Sep 17 00:00:00 2001 From: "serg@serg.mysql.com" <> Date: Mon, 10 Mar 2003 13:16:59 +0100 Subject: [PATCH 3/7] warning added --- mysys/default.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mysys/default.c b/mysys/default.c index c9b0704216a..0f8712d3298 100644 --- a/mysys/default.c +++ b/mysys/default.c @@ -246,10 +246,14 @@ static my_bool search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, #if !defined(__WIN__) && !defined(OS2) { MY_STAT stat_info; - if (!my_stat(name,&stat_info,MYF(MY_WME))) + if (!my_stat(name,&stat_info,MYF(0))) return 0; if (stat_info.st_mode & S_IWOTH) /* ignore world-writeable files */ + { + fprintf(stderr, "warning: World-writeable config file %s is ignored\n", + name); return 0; + } } #endif if (!(fp = my_fopen(fn_format(name,name,"","",4),O_RDONLY,MYF(0)))) From 2c849470e07f99f534775d9de10a1cd8e69515ff Mon Sep 17 00:00:00 2001 From: "lenz@mysql.com" <> Date: Mon, 10 Mar 2003 13:41:37 +0100 Subject: [PATCH 4/7] - typo fix for newly added error message --- sql/mysqld.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 83933e6e8ad..9a227ef5034 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3642,7 +3642,7 @@ static void get_options(int argc,char **argv) if (!mysqld_user) mysqld_user=optarg; else - fprintf(stderr, "Warning: Ignoring user change to '%s' becasue the user is set to '%s' earlier on the command line\n", optarg, mysqld_user); + fprintf(stderr, "Warning: Ignoring user change to '%s' because the user was set to '%s' earlier on the command line\n", optarg, mysqld_user); break; case 'v': case 'V': From 2a3003e99b8e5e5b85b6edbdf00c84eddb2ec3e8 Mon Sep 17 00:00:00 2001 From: "serg@serg.mysql.com" <> Date: Mon, 10 Mar 2003 16:48:13 +0100 Subject: [PATCH 5/7] more propection in mi_open against badly corrupted MYI headers --- myisam/mi_open.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/myisam/mi_open.c b/myisam/mi_open.c index 65e4fe86657..04d035c3ae4 100644 --- a/myisam/mi_open.c +++ b/myisam/mi_open.c @@ -68,7 +68,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) int lock_error,kfile,open_mode,save_errno; uint i,j,len,errpos,head_length,base_pos,offset,info_length,extra,keys, key_parts,unique_key_parts,tmp_length,uniques; - char name_buff[FN_REFLEN],*disk_cache,*disk_pos; + char name_buff[FN_REFLEN],*disk_cache,*disk_pos, *end_pos; MI_INFO info,*m_info,*old_info; MYISAM_SHARE share_buff,*share; ulong rec_per_key_part[MI_MAX_POSSIBLE_KEY*MI_MAX_KEY_SEG]; @@ -129,11 +129,12 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) } info_length=mi_uint2korr(share->state.header.header_length); base_pos=mi_uint2korr(share->state.header.base_pos); - if (!(disk_cache=(char*) my_alloca(info_length))) + if (!(disk_cache=(char*) my_alloca(info_length+128))) { my_errno=ENOMEM; goto err; } + end_pos=disk_cache+info_length; errpos=2; VOID(my_seek(kfile,0L,MY_SEEK_SET,MYF(0))); @@ -269,17 +270,28 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) share->state.header.max_block_size)); strmov(share->filename,name_buff); +#define disk_pos_assert do \ + { \ + if (disk_pos > end_pos) \ + { \ + my_errno=HA_ERR_CRASHED; \ + goto err; \ + } \ + } while(0) + share->blocksize=min(IO_SIZE,myisam_block_size); { MI_KEYSEG *pos=share->keyparts; for (i=0 ; i < keys ; i++) { disk_pos=mi_keydef_read(disk_pos, &share->keyinfo[i]); + disk_pos_assert; set_if_smaller(share->blocksize,share->keyinfo[i].block_length); share->keyinfo[i].seg=pos; for (j=0 ; j < share->keyinfo[i].keysegs; j++,pos++) { disk_pos=mi_keyseg_read(disk_pos, pos); + disk_pos_assert; if (pos->type == HA_KEYTYPE_TEXT || pos->type == HA_KEYTYPE_VARTEXT) { if (!pos->language) @@ -306,10 +318,12 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) for (i=0 ; i < uniques ; i++) { disk_pos=mi_uniquedef_read(disk_pos, &share->uniqueinfo[i]); + disk_pos_assert; share->uniqueinfo[i].seg=pos; for (j=0 ; j < share->uniqueinfo[i].keysegs; j++,pos++) { disk_pos=mi_keyseg_read(disk_pos, pos); + disk_pos_assert; if (pos->type == HA_KEYTYPE_TEXT || pos->type == HA_KEYTYPE_VARTEXT) { if (!pos->language) @@ -334,6 +348,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) for (i=j=offset=0 ; i < share->base.fields ; i++) { disk_pos=mi_recinfo_read(disk_pos,&share->rec[i]); + disk_pos_assert; share->rec[i].pack_type=0; share->rec[i].huff_tree=0; share->rec[i].offset=offset; From c38125c5db32151c6696a96dd0469db1064c6027 Mon Sep 17 00:00:00 2001 From: "monty@mashka.mysql.fi" <> Date: Tue, 11 Mar 2003 21:25:17 +0200 Subject: [PATCH 6/7] Cleaned up disk_pos_assert() to be more general. --- myisam/mi_open.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/myisam/mi_open.c b/myisam/mi_open.c index 04d035c3ae4..1832d525157 100644 --- a/myisam/mi_open.c +++ b/myisam/mi_open.c @@ -35,6 +35,14 @@ static void setup_key_functions(MI_KEYDEF *keyinfo); pos+=size;} +#define disk_pos_assert(pos, end_pos) \ +if (pos > end_pos) \ +{ \ + my_errno=HA_ERR_CRASHED; \ + goto err; \ +} + + /****************************************************************************** ** Return the shared struct if the table is already open. ** In MySQL the server will handle version issues. @@ -270,28 +278,19 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) share->state.header.max_block_size)); strmov(share->filename,name_buff); -#define disk_pos_assert do \ - { \ - if (disk_pos > end_pos) \ - { \ - my_errno=HA_ERR_CRASHED; \ - goto err; \ - } \ - } while(0) - share->blocksize=min(IO_SIZE,myisam_block_size); { MI_KEYSEG *pos=share->keyparts; for (i=0 ; i < keys ; i++) { disk_pos=mi_keydef_read(disk_pos, &share->keyinfo[i]); - disk_pos_assert; + disk_pos_assert(disk_pos + share->keyinfo[i].keysegs * MI_KEYSEG_SIZE, + end_pos); set_if_smaller(share->blocksize,share->keyinfo[i].block_length); share->keyinfo[i].seg=pos; for (j=0 ; j < share->keyinfo[i].keysegs; j++,pos++) { disk_pos=mi_keyseg_read(disk_pos, pos); - disk_pos_assert; if (pos->type == HA_KEYTYPE_TEXT || pos->type == HA_KEYTYPE_VARTEXT) { if (!pos->language) @@ -318,12 +317,12 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) for (i=0 ; i < uniques ; i++) { disk_pos=mi_uniquedef_read(disk_pos, &share->uniqueinfo[i]); - disk_pos_assert; + disk_pos_assert(disk_pos + share->uniqueinfo[i].keysegs * + MI_KEYSEG_SIZE, end_pos); share->uniqueinfo[i].seg=pos; for (j=0 ; j < share->uniqueinfo[i].keysegs; j++,pos++) { disk_pos=mi_keyseg_read(disk_pos, pos); - disk_pos_assert; if (pos->type == HA_KEYTYPE_TEXT || pos->type == HA_KEYTYPE_VARTEXT) { if (!pos->language) @@ -345,10 +344,10 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) for (i=0 ; i < keys ; i++) setup_key_functions(share->keyinfo+i); + disk_pos_assert(disk_pos + share->base.fields *MI_COLUMNDEF_SIZE, end_pos); for (i=j=offset=0 ; i < share->base.fields ; i++) { disk_pos=mi_recinfo_read(disk_pos,&share->rec[i]); - disk_pos_assert; share->rec[i].pack_type=0; share->rec[i].huff_tree=0; share->rec[i].offset=offset; From 8edc75257367838bfb1e64dbaa64c7213cbc2afe Mon Sep 17 00:00:00 2001 From: "monty@mashka.mysql.fi" <> Date: Wed, 12 Mar 2003 01:40:06 +0200 Subject: [PATCH 7/7] Simple fixes (nothing notable) --- dbug/dbug.c | 1 - mysql-test/mysql-test-run.sh | 2 +- mysys/my_lib.c | 2 +- sql/slave.cc | 16 +++++----------- sql/sql_class.cc | 2 ++ 5 files changed, 9 insertions(+), 14 deletions(-) diff --git a/dbug/dbug.c b/dbug/dbug.c index 3f6c9b2f980..a4f9d5ecd4b 100644 --- a/dbug/dbug.c +++ b/dbug/dbug.c @@ -919,7 +919,6 @@ void _db_doprnt_ (const char *format,...) } (void) fprintf (_db_fp_, "%s: ", state->u_keyword); (void) vfprintf (_db_fp_, format, args); - va_end(args); (void) fputc('\n',_db_fp_); dbug_flush(state); errno=save_errno; diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index e0e9af2432a..978fcdfd2b3 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -326,7 +326,7 @@ while test $# -gt 0; do USE_RUNNING_SERVER="" ;; --valgrind) - VALGRIND="valgrind --alignment=8 --leak-check=yes" + VALGRIND="valgrind --alignment=8 --leak-check=yes --num-callers=16" EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-safemalloc" EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-safemalloc" SLEEP_TIME_AFTER_RESTART=10 diff --git a/mysys/my_lib.c b/mysys/my_lib.c index a06120894c5..035bafd07b9 100644 --- a/mysys/my_lib.c +++ b/mysys/my_lib.c @@ -103,7 +103,7 @@ MY_DIR *my_dir(const char *path, myf MyFlags) char dirent_tmp[sizeof(struct dirent)+_POSIX_PATH_MAX+1]; #endif DBUG_ENTER("my_dir"); - DBUG_PRINT("my",("path: '%s' stat: %d MyFlags: %d",path,MyFlags)); + DBUG_PRINT("my",("path: '%s' MyFlags: %d",path,MyFlags)); #if defined(THREAD) && !defined(HAVE_READDIR_R) pthread_mutex_lock(&THR_LOCK_open); diff --git a/sql/slave.cc b/sql/slave.cc index daca8fe1cf6..5ddea7501e4 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -401,9 +401,9 @@ int terminate_slave_threads(MASTER_INFO* mi,int thread_mask,bool skip_lock) DBUG_PRINT("info",("Terminating IO thread")); mi->abort_slave=1; if ((error=terminate_slave_thread(mi->io_thd,io_lock, - io_cond_lock, - &mi->stop_cond, - &mi->slave_running)) && + io_cond_lock, + &mi->stop_cond, + &mi->slave_running)) && !force_all) DBUG_RETURN(error); } @@ -443,12 +443,10 @@ int terminate_slave_thread(THD* thd, pthread_mutex_t* term_lock, be referening freed memory trying to kick it */ THD_CHECK_SENTRY(thd); - if (*slave_running) + + while (*slave_running) // Should always be true { KICK_SLAVE(thd); - } - while (*slave_running) - { /* There is a small chance that slave thread might miss the first alarm. To protect againts it, resend the signal until it reacts @@ -456,10 +454,6 @@ int terminate_slave_thread(THD* thd, pthread_mutex_t* term_lock, struct timespec abstime; set_timespec(abstime,2); pthread_cond_timedwait(term_cond, cond_lock, &abstime); - if (*slave_running) - { - KICK_SLAVE(thd); - } } if (term_lock) pthread_mutex_unlock(term_lock); diff --git a/sql/sql_class.cc b/sql/sql_class.cc index a99d17b0ec4..a481b365182 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -419,12 +419,14 @@ CHANGED_TABLE_LIST* THD::changed_table_dup(const char *key, long key_length) #ifdef SIGNAL_WITH_VIO_CLOSE void THD::close_active_vio() { + DBUG_ENTER("close_active_vio"); safe_mutex_assert_owner(&LOCK_delete); if (active_vio) { vio_close(active_vio); active_vio = 0; } + DBUG_RETURN; } #endif