From 1555f1801d330d07bdaa94f106dbd407a68f3c90 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 20 Dec 2013 12:35:47 +0200 Subject: [PATCH 1/4] make 5.1 compiling with modern gcc. --- mysys/md5.c | 2 +- sql/field.cc | 4 ++-- storage/maria/ma_blockrec.c | 2 +- storage/maria/ma_checksum.c | 2 +- storage/maria/ma_key.c | 2 +- storage/myisam/mi_checksum.c | 2 +- storage/myisam/mi_key.c | 2 +- storage/pbxt/src/myxt_xt.cc | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mysys/md5.c b/mysys/md5.c index 2388cebedc4..22a5e409a09 100644 --- a/mysys/md5.c +++ b/mysys/md5.c @@ -176,7 +176,7 @@ my_MD5Final (unsigned char digest[16], my_MD5Context *ctx) putu32(ctx->buf[1], digest + 4); putu32(ctx->buf[2], digest + 8); putu32(ctx->buf[3], digest + 12); - memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ + memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ } #ifndef ASM_MD5 diff --git a/sql/field.cc b/sql/field.cc index 7e2db40ccb0..5b864bb7ba0 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -7709,7 +7709,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) if (!String::needs_conversion(length, cs, field_charset, &dummy_offset)) { Field_blob::store_length(length); - bmove(ptr+packlength,(char*) &from,sizeof(char*)); + bmove(ptr + packlength, &from, sizeof(char*)); return 0; } if (tmpstr.copy(from, length, cs)) @@ -8364,7 +8364,7 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs) value.copy(from, length, cs); from= value.ptr(); } - bmove(ptr + packlength, (char*) &from, sizeof(char*)); + bmove(ptr + packlength, &from, sizeof(char*)); } return 0; diff --git a/storage/maria/ma_blockrec.c b/storage/maria/ma_blockrec.c index 73b3326fd28..a08cd554615 100644 --- a/storage/maria/ma_blockrec.c +++ b/storage/maria/ma_blockrec.c @@ -7154,7 +7154,7 @@ my_bool _ma_apply_undo_row_delete(MARIA_HA *info, LSN undo_lsn, memcpy(field_pos, field_length_data, size_length); field_length_data+= size_length; - memcpy(field_pos + size_length, &header, sizeof(&header)); + memcpy(field_pos + size_length, &header, sizeof(header)); header+= blob_length; *blob_lengths++= blob_length; break; diff --git a/storage/maria/ma_checksum.c b/storage/maria/ma_checksum.c index 61ec638053a..da2d40d3687 100644 --- a/storage/maria/ma_checksum.c +++ b/storage/maria/ma_checksum.c @@ -58,7 +58,7 @@ ha_checksum _ma_checksum(MARIA_HA *info, const uchar *record) length= _ma_calc_blob_length(blob_size_length, pos); if (length) { - memcpy((char*) &pos, pos + blob_size_length, sizeof(char*)); + memcpy(&pos, pos + blob_size_length, sizeof(char*)); crc= my_checksum(crc, pos, length); } continue; diff --git a/storage/maria/ma_key.c b/storage/maria/ma_key.c index 207ae9a8bda..037e8db2cfb 100644 --- a/storage/maria/ma_key.c +++ b/storage/maria/ma_key.c @@ -583,7 +583,7 @@ static int _ma_put_key_in_record(register MARIA_HA *info, uint keynr, goto err; #endif memcpy(record+keyseg->start+keyseg->bit_start, - (char*) &blob_ptr,sizeof(char*)); + &blob_ptr,sizeof(char*)); memcpy(blob_ptr,key,length); blob_ptr+=length; diff --git a/storage/myisam/mi_checksum.c b/storage/myisam/mi_checksum.c index 8c408ef7ff5..13dd52db22e 100644 --- a/storage/myisam/mi_checksum.c +++ b/storage/myisam/mi_checksum.c @@ -40,7 +40,7 @@ ha_checksum mi_checksum(MI_INFO *info, const uchar *buf) length=_mi_calc_blob_length(column->length- portable_sizeof_char_ptr, buf); - memcpy((char*) &pos, buf+column->length- portable_sizeof_char_ptr, + memcpy(&pos, buf+column->length- portable_sizeof_char_ptr, sizeof(char*)); break; } diff --git a/storage/myisam/mi_key.c b/storage/myisam/mi_key.c index 94f3f34ec58..02254bae68d 100644 --- a/storage/myisam/mi_key.c +++ b/storage/myisam/mi_key.c @@ -419,7 +419,7 @@ static int _mi_put_key_in_record(register MI_INFO *info, uint keynr, goto err; #endif memcpy(record+keyseg->start+keyseg->bit_start, - (char*) &blob_ptr,sizeof(char*)); + &blob_ptr,sizeof(char*)); memcpy(blob_ptr,key,length); blob_ptr+=length; diff --git a/storage/pbxt/src/myxt_xt.cc b/storage/pbxt/src/myxt_xt.cc index b7b81823383..49a22e980ca 100644 --- a/storage/pbxt/src/myxt_xt.cc +++ b/storage/pbxt/src/myxt_xt.cc @@ -937,7 +937,7 @@ xtPublic xtBool myxt_create_row_from_key(XTOpenTablePtr XT_UNUSED(ot), XTIndexPt */ byte *key_ptr = key; // Cannot take the address of a register variable! memcpy(record+keyseg->start+keyseg->bit_start, - (char*) &key_ptr,sizeof(char*)); + &key_ptr,sizeof(char*)); my_store_blob_length(record+keyseg->start, (uint) keyseg->bit_start,length); From 283af34a6d9ac9cdd378a67ccd22da8bcdc577ec Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 20 Jan 2014 19:09:01 +0100 Subject: [PATCH 2/4] MDEV-5543 MyISAM repair unsafe usage of TMD files --- mysql-test/r/repair_symlink-5543.result | 14 +++++++++++++ mysql-test/t/repair_symlink-5543.test | 26 +++++++++++++++++++++++++ storage/maria/ha_maria.cc | 3 ++- storage/myisam/ha_myisam.cc | 3 ++- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 mysql-test/r/repair_symlink-5543.result create mode 100644 mysql-test/t/repair_symlink-5543.test diff --git a/mysql-test/r/repair_symlink-5543.result b/mysql-test/r/repair_symlink-5543.result new file mode 100644 index 00000000000..051c9ca3472 --- /dev/null +++ b/mysql-test/r/repair_symlink-5543.result @@ -0,0 +1,14 @@ +create table t1 (a int) engine=myisam data directory='MYSQL_TMP_DIR'; +insert t1 values (1); +repair table t1; +Table Op Msg_type Msg_text +test.t1 repair error Can't create new tempfile: 'MYSQL_TMP_DIR/t1.TMD' +test.t1 repair status Operation failed +drop table t1; +create table t2 (a int) engine=aria data directory='MYSQL_TMP_DIR'; +insert t2 values (1); +repair table t2; +Table Op Msg_type Msg_text +test.t2 repair error Can't create new tempfile: 'MYSQL_TMP_DIR/t2.TMD' +test.t2 repair status Operation failed +drop table t2; diff --git a/mysql-test/t/repair_symlink-5543.test b/mysql-test/t/repair_symlink-5543.test new file mode 100644 index 00000000000..bad65a4175a --- /dev/null +++ b/mysql-test/t/repair_symlink-5543.test @@ -0,0 +1,26 @@ +# +# MDEV-5543 MyISAM repair unsafe usage of TMD files +# +--source include/have_symlink.inc +--source include/not_windows.inc +--source include/have_maria.inc + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +eval create table t1 (a int) engine=myisam data directory='$MYSQL_TMP_DIR'; +insert t1 values (1); +--system ln -s $MYSQL_TMP_DIR/foobar5543 $MYSQL_TMP_DIR/t1.TMD +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +repair table t1; +drop table t1; + +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +eval create table t2 (a int) engine=aria data directory='$MYSQL_TMP_DIR'; +insert t2 values (1); +--system ln -s $MYSQL_TMP_DIR/foobar5543 $MYSQL_TMP_DIR/t2.TMD +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +repair table t2; +drop table t2; + +--list_files $MYSQL_TMP_DIR foobar5543 +--system rm $MYSQL_TMP_DIR/t1.TMD $MYSQL_TMP_DIR/t2.TMD + diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index ce308887516..f1cb53a43cf 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -1,5 +1,6 @@ /* Copyright (C) 2004-2008 MySQL AB & MySQL Finland AB & TCX DataKonsult AB Copyright (C) 2008-2009 Sun Microsystems, Inc. + Copyright (c) 2009, 2014, SkySQL Ab. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1467,7 +1468,7 @@ int ha_maria::repair(THD *thd, HA_CHECK *param, bool do_optimize) param->db_name= table->s->db.str; param->table_name= table->alias; - param->tmpfile_createflag= O_RDWR | O_TRUNC; + param->tmpfile_createflag= O_RDWR | O_TRUNC | O_EXCL; param->using_global_keycache= 1; param->thd= thd; param->tmpdir= &mysql_tmpdir_list; diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index 2be71dadf4b..aa56077469b 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -1,5 +1,6 @@ /* Copyright (c) 2000, 2011, Oracle and/or its affiliates + Copyright (c) 2009, 2014, SkySQL Ab. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1138,7 +1139,7 @@ int ha_myisam::repair(THD *thd, HA_CHECK ¶m, bool do_optimize) param.db_name= table->s->db.str; param.table_name= table->alias; - param.tmpfile_createflag = O_RDWR | O_TRUNC; + param.tmpfile_createflag= O_RDWR | O_TRUNC | O_EXCL; param.using_global_keycache = 1; param.thd= thd; param.tmpdir= &mysql_tmpdir_list; From c0065d153938eea2a7c2729e7e65d624affc040e Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 20 Jan 2014 20:53:39 +0100 Subject: [PATCH 3/4] fix a warning --- mysql-test/mysql-test-run.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index e4beae1c10b..60725b4448e 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -478,7 +478,7 @@ sub main { } } - if ( not defined @$completed ) { + if ( not @$completed ) { mtr_error("Test suite aborted"); } From 5f5f7befe37e942d4fff0771ac79d143ca4500c6 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 23 Jan 2014 11:11:01 +0200 Subject: [PATCH 4/4] MDEV-5356: Server crashes in Item_equal::contains on 2nd execution of a PS THD::thd->activate_stmt_arena_if_needed() should be used to temporary activating statement arena instead of direct usage of THD::set_n_backup_active_arena() because possible such scenario: 1) func1 saves current arena and activates copy1 of statement arena 2) func2 saves copy1 of statement arena setup by func1 and activates copy2 3) some changes made for copy 2 4) func2 stores changed copy2 back to statenet arena and activates copy1 5) func1 store unchanged copy1 back to statemnt arena (rewrite changed copy 2 so changes become lost) and activates arena which was before. --- sql/sql_base.cc | 7 ++----- sql/sql_select.cc | 7 ++----- sql/sql_view.cc | 6 +----- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 283d56f6d48..2b0f0daf554 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -7843,12 +7843,9 @@ bool setup_tables(THD *thd, Name_resolution_context *context, { DBUG_ASSERT(table_list->view && table_list->effective_algorithm == VIEW_ALGORITHM_MERGE); - Query_arena *arena= thd->stmt_arena, backup; + Query_arena *arena, backup; + arena= thd->activate_stmt_arena_if_needed(&backup); bool res; - if (arena->is_conventional()) - arena= 0; // For easier test - else - thd->set_n_backup_active_arena(arena, &backup); res= table_list->setup_underlying(thd); if (arena) thd->restore_active_arena(arena, &backup); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index d8bbabd5f63..6434c045da0 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -882,11 +882,8 @@ JOIN::optimize() MEMROOT for prepared statements and stored procedures. */ - Query_arena *arena= thd->stmt_arena, backup; - if (arena->is_conventional()) - arena= 0; // For easier test - else - thd->set_n_backup_active_arena(arena, &backup); + Query_arena *arena, backup; + arena= thd->activate_stmt_arena_if_needed(&backup); sel->first_cond_optimization= 0; diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 27bdfed6bea..8dde595f401 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -1121,11 +1121,7 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table, will be TRUE as far as we make new table cache). */ old_lex= thd->lex; - arena= thd->stmt_arena; - if (arena->is_conventional()) - arena= 0; - else - thd->set_n_backup_active_arena(arena, &backup); + arena= thd->activate_stmt_arena_if_needed(&backup); /* init timestamp */ if (!table->timestamp.str)