List:Commits« Previous MessageNext Message »
From:antony Date:October 3 2007 10:29pm
Subject:bk commit into 5.1 tree (antony:1.2565) BUG#31382
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of antony. When antony does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-10-03 15:29:26-07:00, antony@stripped +3 -0
  Bug#31382
    "Disabled plugin is provoking Valgrind error"
    If there are any auto-alloced string plug-in options, memory is
    allocated during the call for handle_options(). We must free this
    memory if we are not installing the plug-in.

  include/my_getopt.h@stripped, 2007-10-03 15:29:15-07:00, antony@stripped +1 -0
    bug31382
      new function: my_cleanup_options()

  mysys/my_getopt.c@stripped, 2007-10-03 15:29:15-07:00, antony@stripped +43 -3
    bug31382
      new function: my_cleanup_options(), fini_one_value()
      alter init_variables() to take an extra option.
      forward declare init_one_value() and fini_one_value()

  sql/sql_plugin.cc@stripped, 2007-10-03 15:29:15-07:00, antony@stripped +7 -3
    bug31382
      after calling handle_options(), make sure to call my_cleanup_options()
      if we are not installing the plug-in.

diff -Nrup a/include/my_getopt.h b/include/my_getopt.h
--- a/include/my_getopt.h	2007-07-30 01:33:41 -07:00
+++ b/include/my_getopt.h	2007-10-03 15:29:15 -07:00
@@ -68,6 +68,7 @@ extern my_error_reporter my_getopt_error
 
 extern int handle_options (int *argc, char ***argv, 
 			   const struct my_option *longopts, my_get_one_option);
+extern void my_cleanup_options(const struct my_option *options);
 extern void my_print_help(const struct my_option *options);
 extern void my_print_variables(const struct my_option *options);
 extern void my_getopt_register_get_addr(uchar ** (*func_addr)(const char *, uint,
diff -Nrup a/mysys/my_getopt.c b/mysys/my_getopt.c
--- a/mysys/my_getopt.c	2007-07-30 01:33:42 -07:00
+++ b/mysys/my_getopt.c	2007-10-03 15:29:15 -07:00
@@ -20,6 +20,9 @@
 #include <mysys_err.h>
 #include <my_getopt.h>
 
+typedef void (*init_func_p)(const struct my_option *option, uchar* *variable,
+                            longlong value);
+
 static void default_reporter(enum loglevel level, const char *format, ...);
 my_error_reporter my_getopt_error_reporter= &default_reporter;
 
@@ -33,7 +36,12 @@ static longlong getopt_ll(char *arg, con
 static ulonglong getopt_ull(char *arg, const struct my_option *optp,
 			    int *err);
 static double getopt_double(char *arg, const struct my_option *optp, int *err);
-static void init_variables(const struct my_option *options);
+static void init_variables(const struct my_option *options,
+                           init_func_p init_one_value);
+static void init_one_value(const struct my_option *option, uchar* *variable,
+			   longlong value);
+static void fini_one_value(const struct my_option *option, uchar* *variable,
+			   longlong value);
 static int setval(const struct my_option *opts, uchar* *value, char *argument,
 		  my_bool set_maximum_value);
 static char *check_struct_option(char *cur_arg, char *key_name);
@@ -117,7 +125,7 @@ int handle_options(int *argc, char ***ar
   DBUG_ASSERT(argv && *argv);
   (*argc)--; /* Skip the program name */
   (*argv)++; /*      --- || ----      */
-  init_variables(longopts);
+  init_variables(longopts, init_one_value);
 
   for (pos= *argv, pos_end=pos+ *argc; pos != pos_end ; pos++)
   {
@@ -906,6 +914,37 @@ static void init_one_value(const struct 
 }
 
 
+/*
+  Init one value to it's default values
+
+  SYNOPSIS
+    init_one_value()
+    option		Option to initialize
+    value		Pointer to variable
+*/
+
+static void fini_one_value(const struct my_option *option, uchar* *variable,
+			   longlong value __attribute__ ((unused)))
+{
+  DBUG_ENTER("fini_one_value");
+  switch ((option->var_type & GET_TYPE_MASK)) {
+  case GET_STR_ALLOC:
+    my_free((*(char**) variable), MYF(MY_ALLOW_ZERO_PTR));
+    *((char**) variable)= NULL;
+    break;
+  default: /* dummy default to avoid compiler warnings */
+    break;
+  }
+  DBUG_VOID_RETURN;
+}
+
+
+void my_cleanup_options(const struct my_option *options)
+{
+  init_variables(options, fini_one_value);
+}
+
+
 /* 
   initialize all variables to their default values
 
@@ -919,7 +958,8 @@ static void init_one_value(const struct 
     for a value and initialize.
 */
 
-static void init_variables(const struct my_option *options)
+static void init_variables(const struct my_option *options,
+                           init_func_p init_one_value)
 {
   DBUG_ENTER("init_variables");
   for (; options->name; options++)
diff -Nrup a/sql/sql_plugin.cc b/sql/sql_plugin.cc
--- a/sql/sql_plugin.cc	2007-08-25 01:43:14 -07:00
+++ b/sql/sql_plugin.cc	2007-10-03 15:29:15 -07:00
@@ -3092,7 +3092,7 @@ static int test_plugin_options(MEM_ROOT 
     {
        sql_print_error("Parsing options for plugin '%s' failed.",
                        tmp->name.str);
-       DBUG_RETURN(error);
+       goto err;
     }
   }
 
@@ -3102,6 +3102,8 @@ static int test_plugin_options(MEM_ROOT 
     *enabled= TRUE;
   }
 
+  error= 1;
+
   if (*enabled)
   {
     for (opt= tmp->plugin->system_vars; opt && *opt; opt++)
@@ -3140,7 +3142,7 @@ static int test_plugin_options(MEM_ROOT 
       {
         sql_print_error("Plugin '%s' has conflicting system variables",
                         tmp->name.str);
-        DBUG_RETURN(1);
+        goto err;
       }
       tmp->system_vars= chain.first;
     }
@@ -3150,7 +3152,9 @@ static int test_plugin_options(MEM_ROOT 
   if (enabled_saved && global_system_variables.log_warnings)
     sql_print_information("Plugin '%s' disabled by command line option",
                           tmp->name.str);
-  DBUG_RETURN(1);
+err:
+  my_cleanup_options(opts);
+  DBUG_RETURN(error);
 }
 
 
Thread
bk commit into 5.1 tree (antony:1.2565) BUG#31382antony4 Oct
  • Re: bk commit into 5.1 tree (antony:1.2565) BUG#31382Sergei Golubchik4 Oct