Skip to content

Commit

Permalink
Bug #26826272: REMOVE GCC 8 WARNINGS [noclose]
Browse files Browse the repository at this point in the history
Fix an antipattern in my_load_defaults where the MEM_ROOT was stored
in a memory just before the (new) argv array; replace it with an explicit
MEM_ROOT, which has a much cleaner destructor pattern.

The main motivation for this is to get rid of the GCC 8 warning about
memcpy-ing the MEM_ROOT.

Change-Id: I524b37b0274a32c80eacde91656f18bb2fe7c77b
  • Loading branch information
Steinar H. Gunderson committed Sep 26, 2017
1 parent 9565ee1 commit bbd31a4
Show file tree
Hide file tree
Showing 49 changed files with 190 additions and 274 deletions.
11 changes: 2 additions & 9 deletions client/base/abstract_program.cc
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,7 @@ my_option* Abstract_program::get_options_array()

Abstract_program::Abstract_program()
: m_debug_options(this),
m_help_options(this),
m_defaults_argv(NULL)
m_help_options(this)
{
this->add_providers(&this->m_help_options, &this->m_debug_options, NULL);
}
Expand All @@ -71,13 +70,11 @@ void Abstract_program::run(int argc, char **argv)
this->aggregate_options();

my_getopt_use_args_separator= TRUE;
if (load_defaults("my",load_default_groups,&argc,&argv))
if (load_defaults("my",load_default_groups,&argc,&argv, &m_argv_alloc))
this->error(Message_data(
1, "Error during loading default options", Message_type_error));
my_getopt_use_args_separator= FALSE;

this->m_defaults_argv= argv;

int ho_error= handle_options(&argc, &argv, this->get_options_array(),
Abstract_program::callback_option_parsed);
if (ho_error != 0)
Expand All @@ -103,10 +100,6 @@ void Abstract_program::run(int argc, char **argv)

Abstract_program::~Abstract_program()
{
if (this->m_defaults_argv)
{
free_defaults(this->m_defaults_argv);
}
}

void Abstract_program::init_name(char *name_from_cmd_line)
Expand Down
2 changes: 1 addition & 1 deletion client/base/abstract_program.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ class Abstract_program : public Options::Composite_options_provider
Options::Debug_options m_debug_options;
Options::Help_options m_help_options;
std::vector<my_option> m_options;
char **m_defaults_argv;
MEM_ROOT m_argv_alloc{PSI_NOT_INSTRUMENTED, 512, 0};
std::string m_name;

friend class Abstract_connection_program;
Expand Down
12 changes: 7 additions & 5 deletions client/check/mysqlcheck.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "caching_sha2_passwordopt-vars.h"
#include "client/client_priv.h"
#include "m_ctype.h"
#include "my_alloc.h"
#include "my_dbug.h"
#include "my_default.h"
#include "my_inttypes.h"
Expand Down Expand Up @@ -218,7 +219,7 @@ static const char *load_default_groups[] = { "mysqlcheck", "client", 0 };


static void usage(void);
static int get_options(int *argc, char ***argv);
static int get_options(int *argc, char ***argv, MEM_ROOT *alloc);
static int dbConnect(char *host, char *user,char *passwd);
static void dbDisconnect(char *host);
static void DBerror(MYSQL *mysql, string when);
Expand Down Expand Up @@ -343,7 +344,7 @@ get_one_option(int optid, const struct my_option *opt,
}


static int get_options(int *argc, char ***argv)
static int get_options(int *argc, char ***argv, MEM_ROOT *alloc)
{
int ho_error;

Expand All @@ -354,7 +355,7 @@ static int get_options(int *argc, char ***argv)
}

my_getopt_use_args_separator= TRUE;
if ((ho_error= load_defaults("my", load_default_groups, argc, argv)) ||
if ((ho_error= load_defaults("my", load_default_groups, argc, argv, alloc)) ||
(ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
exit(ho_error);
my_getopt_use_args_separator= FALSE;
Expand Down Expand Up @@ -499,7 +500,8 @@ int main(int argc, char **argv)
/*
** Check out the args
*/
if (get_options(&argc, &argv))
MEM_ROOT alloc(PSI_NOT_INSTRUMENTED, 512, 0);
if (get_options(&argc, &argv, &alloc))
{
my_end(my_end_arg);
exit(EX_USAGE);
Expand Down Expand Up @@ -530,7 +532,7 @@ int main(int argc, char **argv)
#if defined (_WIN32)
my_free(shared_memory_base_name);
#endif
free_defaults(argv);
free_root(&alloc, MYF(0));
my_end(my_end_arg);
return(first_error!=0);
} /* main */
19 changes: 7 additions & 12 deletions client/mysql.cc
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ struct STATUS


static HashTable ht;
static char **defaults_argv;
static MEM_ROOT argv_alloc{PSI_NOT_INSTRUMENTED, 512, 0};

enum enum_info_type { INFO_INFO,INFO_ERROR,INFO_RESULT};
typedef enum enum_info_type INFO_TYPE;
Expand Down Expand Up @@ -1296,35 +1296,31 @@ int main(int argc,char *argv[])
#endif

my_getopt_use_args_separator= TRUE;
if (load_defaults("my",load_default_groups,&argc,&argv))
if (load_defaults("my",load_default_groups,&argc,&argv,&argv_alloc))
{
my_end(0);
exit(1);
return EXIT_FAILURE;
}
my_getopt_use_args_separator= FALSE;

defaults_argv=argv;
if (get_options(argc, (char **) argv))
{
free_defaults(defaults_argv);
my_end(0);
exit(1);
return EXIT_FAILURE;
}
if (status.batch && !status.line_buff &&
!(status.line_buff= batch_readline_init(MAX_BATCH_BUFFER_SIZE, stdin)))
{
put_info("Can't initialize batch_readline - may be the input source is "
"a directory or a block device.", INFO_ERROR, 0);
free_defaults(defaults_argv);
my_end(0);
exit(1);
return EXIT_FAILURE;
}
if (mysql_server_init(0, nullptr, nullptr))
{
put_error(NULL);
free_defaults(defaults_argv);
my_end(0);
exit(1);
return EXIT_FAILURE;
}
glob_buffer.mem_realloc(512);
completion_hash_init(&ht, 128);
Expand Down Expand Up @@ -1431,7 +1427,7 @@ int main(int argc,char *argv[])
MYF(MY_WME))))
{
fprintf(stderr, "Couldn't allocate memory for temp histfile!\n");
exit(1);
return EXIT_FAILURE;
}
sprintf(histfile_tmp, "%s.TMP", histfile);
}
Expand Down Expand Up @@ -1521,7 +1517,6 @@ void mysql_end(int sig)
#endif
my_free(current_prompt);
mysql_server_end();
free_defaults(defaults_argv);
my_end(my_end_arg);
exit(status.exit_status);
}
Expand Down
7 changes: 2 additions & 5 deletions client/mysql_secure_installation.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

using namespace std;

static char **defaults_argv= 0;
static MEM_ROOT argv_alloc{PSI_NOT_INSTRUMENTED, 512, 0};
static char *opt_host= 0;
static char *opt_user= 0;
static uint opt_port= 0;
Expand Down Expand Up @@ -121,8 +121,6 @@ static void free_resources()
if (password)
my_free(password);
mysql_close(&mysql);
if (defaults_argv && *defaults_argv)
free_defaults(defaults_argv);
}

extern "C" {
Expand Down Expand Up @@ -931,14 +929,13 @@ int main(int argc,char *argv[])
#endif

my_getopt_use_args_separator= TRUE;
if (load_defaults("my", load_default_groups, &argc, &argv))
if (load_defaults("my", load_default_groups, &argc, &argv, &argv_alloc))
{
my_end(0);
free_resources();
exit(1);
}

defaults_argv= argv;
my_getopt_use_args_separator= FALSE;

if ((rc= my_handle_options(&argc, &argv, my_connection_options,
Expand Down
5 changes: 2 additions & 3 deletions client/mysql_ssl_rsa_setup.cc
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,6 @@ void free_resources()
if (opt_userid)
my_free(opt_userid);
#endif
if (defaults_argv && *defaults_argv)
free_defaults(defaults_argv);
}


Expand Down Expand Up @@ -453,6 +451,7 @@ int main(int argc, char *argv[])
int ret_val= 0;
Sql_string_t openssl_check("openssl version");
bool save_skip_unknown= my_getopt_skip_unknown;
MEM_ROOT alloc{PSI_NOT_INSTRUMENTED, 512, 0};

MY_INIT(argv[0]);
DBUG_ENTER("main");
Expand All @@ -465,7 +464,7 @@ int main(int argc, char *argv[])
my_win_translate_command_line_args(&my_charset_utf8mb4_bin, &argc, &argv);
#endif
my_getopt_use_args_separator= TRUE;
if (load_defaults("my", load_default_groups, &argc, &argv))
if (load_defaults("my", load_default_groups, &argc, &argv, &alloc))
{
my_end(0);
free_resources();
Expand Down
12 changes: 5 additions & 7 deletions client/mysqladmin.cc
Original file line number Diff line number Diff line change
Expand Up @@ -345,20 +345,19 @@ int main(int argc,char *argv[])
int first_command;
bool can_handle_passwords;
MYSQL mysql;
char **commands, **save_argv, **temp_argv;
char **commands, **temp_argv;

MY_INIT(argv[0]);
mysql_init(&mysql);
my_getopt_use_args_separator= TRUE;
if (load_defaults("my",load_default_groups,&argc,&argv))
MEM_ROOT alloc{PSI_NOT_INSTRUMENTED, 512, 0};
if (load_defaults("my",load_default_groups,&argc,&argv,&alloc))
exit(1);
my_getopt_use_args_separator= FALSE;

save_argv = argv; /* Save for free_defaults */
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
{
free_defaults(save_argv);
exit(ho_error);
return ho_error;
}

if (debug_info_flag)
Expand All @@ -369,7 +368,7 @@ int main(int argc,char *argv[])
if (argc == 0)
{
usage();
exit(1);
return EXIT_FAILURE;
}

temp_argv= mask_password(argc, &argv);
Expand Down Expand Up @@ -528,7 +527,6 @@ int main(int argc,char *argv[])
#if defined (_WIN32)
my_free(shared_memory_base_name);
#endif
free_defaults(save_argv);
temp_argc--;
while(temp_argc >= 0)
{
Expand Down
20 changes: 7 additions & 13 deletions client/mysqlbinlog.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2942,7 +2942,6 @@ inline bool gtid_client_init()

int main(int argc, char** argv)
{
char **defaults_argv;
Exit_status retval= OK_CONTINUE;
MY_INIT(argv[0]);
DBUG_ENTER("main");
Expand All @@ -2960,31 +2959,30 @@ int main(int argc, char** argv)
buff_ev= new Buff_ev(PSI_NOT_INSTRUMENTED);

my_getopt_use_args_separator= TRUE;
if (load_defaults("my", load_default_groups, &argc, &argv))
MEM_ROOT alloc{PSI_NOT_INSTRUMENTED, 512, 0};
if (load_defaults("my", load_default_groups, &argc, &argv, &alloc))
exit(1);
my_getopt_use_args_separator= FALSE;
defaults_argv= argv;

parse_args(&argc, &argv);

if (!argc)
{
usage();
free_defaults(defaults_argv);
my_end(my_end_arg);
exit(1);
return EXIT_FAILURE;
}

if (gtid_client_init())
{
error("Could not initialize GTID structuress.");
exit(1);
return EXIT_FAILURE;
}

umask(((~my_umask) & 0666));
/* Check for argument conflicts and do any post-processing */
if (args_post_process() == ERROR_STOP)
exit(1);
return EXIT_FAILURE;

if (opt_base64_output_mode == BASE64_OUTPUT_UNSPEC)
opt_base64_output_mode= BASE64_OUTPUT_AUTO;
Expand All @@ -2999,7 +2997,7 @@ int main(int argc, char** argv)
if (!dirname_for_local_load)
{
if (init_tmpdir(&tmpdir, 0))
exit(1);
return EXIT_FAILURE;
dirname_for_local_load= my_strdup(PSI_NOT_INSTRUMENTED,
my_tmpdir(&tmpdir), MY_WME);
}
Expand Down Expand Up @@ -3074,15 +3072,11 @@ int main(int argc, char** argv)
my_fclose(result_file, MYF(0));
cleanup();

if (defaults_argv)
free_defaults(defaults_argv);
my_free_open_file_info();
load_processor.destroy();
/* We cannot free DBUG, it is used in global destructors after exit(). */
my_end(my_end_arg | MY_DONT_FREE_DBUG);
gtid_client_cleanup();

exit(retval == ERROR_STOP ? 1 : 0);
/* Keep compilers happy. */
DBUG_RETURN(retval == ERROR_STOP ? 1 : 0);
return(retval == ERROR_STOP ? EXIT_FAILURE : EXIT_SUCCESS);
}
8 changes: 2 additions & 6 deletions client/mysqldump.cc
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ static char *opt_password=0,*current_user=0,
*opt_compatible_mode_str= 0,
*err_ptr= 0, *opt_ignore_error= 0,
*log_error_file= NULL;
static char **defaults_argv= 0;
static MEM_ROOT argv_alloc{PSI_NOT_INSTRUMENTED, 512, 0};
static char compatible_mode_normal_str[255];
/* Server supports character_set_results session variable? */
static bool server_supports_switching_charsets= TRUE;
Expand Down Expand Up @@ -998,12 +998,10 @@ static int get_options(int *argc, char ***argv)

md_result_file= stdout;
my_getopt_use_args_separator= TRUE;
if (load_defaults("my",load_default_groups,argc,argv))
if (load_defaults("my",load_default_groups,argc,argv,&argv_alloc))
return 1;
my_getopt_use_args_separator= FALSE;

defaults_argv= *argv;

ignore_table= new collation_unordered_set<string>(charset_info, PSI_NOT_INSTRUMENTED);
/* Don't copy internal log tables */
ignore_table->insert("mysql.apply_status");
Expand Down Expand Up @@ -1542,8 +1540,6 @@ static void free_resources()
}
if (insert_pat_inited)
dynstr_free(&insert_pat);
if (defaults_argv)
free_defaults(defaults_argv);
if (opt_ignore_error)
my_free(opt_ignore_error);
my_end(my_end_arg);
Expand Down
Loading

0 comments on commit bbd31a4

Please sign in to comment.