diff options
author | unknown <monty@mashka.mysql.fi> | 2002-12-05 16:38:49 +0200 |
---|---|---|
committer | unknown <monty@mashka.mysql.fi> | 2002-12-05 16:38:49 +0200 |
commit | fdb093fc476af146feaa6d4403db0c25bb6484d8 (patch) | |
tree | e7064c81623ddc900c1933e03b9ce1c1fe234ff6 /libmysqld/lib_sql.cc | |
parent | 5fdd9f878f3b4690e3f6f0710e5930a81fcd368a (diff) | |
download | mariadb-git-fdb093fc476af146feaa6d4403db0c25bb6484d8.tar.gz |
Copy arguments given to mysql_server_init()
Made keybuff_size longlong (To make show variables work similar on 32
and 64 bit systems)
Fixed some 'not initalized variable errors' in multi-table-update.
Fixed memory leak in multi-table-update.
Now all tests works under valgrind without any errors.
libmysqld/lib_sql.cc:
Copy arguments given to mysql_server_init()
mysql-test/r/temp_table.result:
Update test results (after merge form 3.23)
sql/handler.cc:
Made keybuff_size longlong
sql/mysql_priv.h:
Made keybuff_size longlong
sql/mysqld.cc:
Made keybuff_size longlong
sql/set_var.cc:
Made keybuff_size longlong
sql/set_var.h:
Made keybuff_size longlong
sql/sql_select.cc:
Simple cleanup
sql/sql_select.h:
Make TMP_TABLE_PARAM to be allocated through Sql_alloc
sql/sql_update.cc:
Fixed some 'not initalized variable errors' in multi-table-update.
Fixed memory leak in multi-table-update
Diffstat (limited to 'libmysqld/lib_sql.cc')
-rw-r--r-- | libmysqld/lib_sql.cc | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index 94f30e5061b..14d293d91e3 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -275,11 +275,39 @@ static bool check_user(THD *thd,enum_server_command command, const char *user, } +/* + Make a copy of array and the strings array points to +*/ + +char **copy_arguments(int argc, char **argv) +{ + uint length= 0; + char **from, **res, **end= argv+argc; + + for (from=argv ; from != end ; from++) + length+= strlen(*from); + + if ((res= (char**) my_malloc(sizeof(argv)*(argc+1)+length+argc, + MYF(MY_WME)))) + { + char **to= res, *to_str= (char*) (res+argc+1); + for (from=argv ; from != end ;) + { + *to++= to_str; + to_str= strmov(to_str, *from++)+1; + } + *to= 0; // Last ptr should be null + } + return res; +} + + extern "C" { static my_bool inited, org_my_init_done; ulong max_allowed_packet, net_buffer_length; +char ** copy_arguments_ptr= 0; int STDCALL mysql_server_init(int argc, char **argv, char **groups) { @@ -303,7 +331,7 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) argvp = (char ***) &fake_argv; } if (!groups) - groups = (char**) fake_groups; + groups = (char**) fake_groups; my_umask=0660; // Default umask for new files my_umask_dir=0700; // Default umask for new directories @@ -319,6 +347,14 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) MY_INIT((char *)"mysql_embedded"); // init my_sys library & pthreads } + /* + Make a copy of the arguments to guard against applications that + may change or move the initial arguments. + */ + if (argvp == &argv) + if (!(copy_arguments_ptr= argv= copy_arguments(argc, argv))) + return 1; + tzset(); // Set tzname start_time=time((time_t*) 0); @@ -566,6 +602,8 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) void STDCALL mysql_server_end() { + my_free((char*) copy_arguments_ptr, MYF(MY_ALLOW_ZERO_PTR)); + copy_arguments_ptr=0; clean_up(0); #ifdef THREAD /* Don't call my_thread_end() if the application is using MY_INIT() */ |