List:Commits« Previous MessageNext Message »
From:tim Date:February 22 2008 10:07pm
Subject:bk commit into 5.0 tree (tsmith:1.2576) BUG#20748
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of tsmith.  When tsmith 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, 2008-02-22 14:06:53-07:00, tsmith@stripped +1 -0
  Bug #20748: Configuration files should not be read more than once
  
  Normalize directory names before adding them to default_directories.

  mysys/default.c@stripped, 2008-02-22 14:06:51-07:00, tsmith@stripped +54 -34
    Normalize directory names with unpack_dirname() before adding them
    to default_directories.  This way, /etc/ and /etc will not count as
    duplicates.
    

diff -Nrup a/mysys/default.c b/mysys/default.c
--- a/mysys/default.c	2007-11-16 14:56:35 -07:00
+++ b/mysys/default.c	2008-02-22 14:06:51 -07:00
@@ -97,7 +97,7 @@ static int search_default_file_with_ext(
   @return void
 */
 
-static void (*init_default_directories)();
+static void (*init_default_directories)(MEM_ROOT *alloc);
 
 
 static char *remove_end_comment(char *ptr);
@@ -386,8 +386,8 @@ int load_defaults(const char *conf_file,
   struct handle_option_ctx ctx;
   DBUG_ENTER("load_defaults");
 
-  init_default_directories();
   init_alloc_root(&alloc,512,0);
+  init_default_directories(&alloc);
   /*
     Check if the user doesn't want any default option processing
     --no-defaults is always the first option
@@ -863,10 +863,12 @@ void my_print_default_files(const char *
   const char *empty_list[]= { "", 0 };
   my_bool have_ext= fn_ext(conf_file)[0] != 0;
   const char **exts_to_use= have_ext ? empty_list : f_extensions;
+  MEM_ROOT alloc;
   char name[FN_REFLEN], **ext;
   const char **dirs;
 
-  init_default_directories();
+  init_alloc_root(&alloc,512,0);
+  init_default_directories(&alloc);
   puts("\nDefault options are read from the following files in the given order:");
 
   if (dirname_length(conf_file))
@@ -894,6 +896,8 @@ void my_print_default_files(const char *
     }
   }
   puts("");
+
+  free_root(&alloc, MYF(0));
 }
 
 void print_defaults(const char *conf_file, const char **groups)
@@ -928,31 +932,43 @@ void print_defaults(const char *conf_fil
 #include <help_end.h>
 
 
+static my_bool add_directory_internal(MEM_ROOT *alloc, const char *dir)
+{
+  char buf[FN_REFLEN];
+  uint len;
+  char *p;
+
+  /* Normalize directory name */
+  len= unpack_dirname(buf, dir);
+  if (!(p= strmake_root(alloc, buf, len)))
+    return TRUE;  /* Failure */
+  return array_append_string_unique(p, default_directories,
+                                    array_elements(default_directories));
+}
+
 /*
   This extra complexity is to avoid declaring 'rc' if it won't be
   used.
 */
-#define ADD_DIRECTORY_INTERNAL(DIR) \
-  array_append_string_unique((DIR), default_directories, \
-                             array_elements(default_directories))
+
 #ifdef DBUG_OFF
-#  define ADD_DIRECTORY(DIR)  (void) ADD_DIRECTORY_INTERNAL(DIR)
+#define ADD_DIRECTORY(ALLOC, DIR)  (void) add_directory_internal((ALLOC), (DIR))
 #else
-#define ADD_DIRECTORY(DIR) \
+#define ADD_DIRECTORY(ALLOC, DIR) \
   do { \
-    my_bool rc= ADD_DIRECTORY_INTERNAL(DIR); \
+    my_bool rc= add_directory_internal((ALLOC), (DIR)); \
     DBUG_ASSERT(rc == FALSE);                   /* Success */ \
   } while (0)
 #endif
 
 
-#define ADD_COMMON_DIRECTORIES() \
+#define ADD_COMMON_DIRECTORIES(ALLOC) \
   do { \
     char *env; \
     if ((env= getenv(STRINGIFY_ARG(DEFAULT_HOME_ENV)))) \
-      ADD_DIRECTORY(env); \
+      ADD_DIRECTORY((ALLOC), env); \
     /* Placeholder for --defaults-extra-file=<path> */ \
-    ADD_DIRECTORY(""); \
+    ADD_DIRECTORY((ALLOC), ""); \
   } while (0)
 
 
@@ -1004,18 +1020,18 @@ static uint my_get_system_windows_direct
     6. --defaults-extra-file=<path> (run-time option)
 */
 
-static void init_default_directories_win()
+static void init_default_directories_win(MEM_ROOT *alloc)
 {
   bzero((char *) default_directories, sizeof(default_directories));
 
   if (my_get_system_windows_directory(shared_system_dir,
                                       sizeof(shared_system_dir)))
-    ADD_DIRECTORY(shared_system_dir);
+    ADD_DIRECTORY(alloc, shared_system_dir);
 
   if (GetWindowsDirectory(system_dir,sizeof(system_dir)))
-    ADD_DIRECTORY(system_dir);
+    ADD_DIRECTORY(alloc, system_dir);
 
-  ADD_DIRECTORY("C:/");
+  ADD_DIRECTORY(alloc, "C:/");
 
   if (GetModuleFileName(NULL, config_dir, sizeof(config_dir)))
   {
@@ -1046,13 +1062,14 @@ static void init_default_directories_win
         last= end;
       }
     }
-    ADD_DIRECTORY(config_dir);
+    ADD_DIRECTORY(alloc, config_dir);
   }
 
-  ADD_COMMON_DIRECTORIES();
+  ADD_COMMON_DIRECTORIES(alloc);
 }
 
-static void (*init_default_directories)()= init_default_directories_win;
+static void (*init_default_directories)(MEM_ROOT *alloc)=
+  init_default_directories_win;
 
 #elif defined(__NETWARE__)
 
@@ -1065,14 +1082,15 @@ static void (*init_default_directories)(
     3. --defaults-extra-file=<path> (run-time option)
 */
 
-static void init_default_directories_netware()
+static void init_default_directories_netware(MEM_ROOT *alloc)
 {
   bzero((char *) default_directories, sizeof(default_directories));
-  ADD_DIRECTORY("sys:/etc/");
-  ADD_COMMON_DIRECTORIES();
+  ADD_DIRECTORY(alloc, "sys:/etc/");
+  ADD_COMMON_DIRECTORIES(alloc);
 }
 
-static void (*init_default_directories)()= init_default_directories_netware;
+static void (*init_default_directories)(MEM_ROOT *alloc)=
+  init_default_directories_netware;
 
 #elif defined(__EMX__) || defined(OS2)
 
@@ -1086,18 +1104,19 @@ static void (*init_default_directories)(
     4. --defaults-extra-file=<path> (run-time option)
 */
 
-static void init_default_directories_os2()
+static void init_default_directories_os2(MEM_ROOT *alloc)
 {
   const char *env;
 
   bzero((char *) default_directories, sizeof(default_directories));
-  ADD_DIRECTORY("/etc/");
+  ADD_DIRECTORY(alloc, "/etc/");
   if ((env= getenv("ETC")))
-    ADD_DIRECTORY(env);
-  ADD_COMMON_DIRECTORIES();
+    ADD_DIRECTORY(alloc, env);
+  ADD_COMMON_DIRECTORIES(alloc);
 }
 
-static void (*init_default_directories)()= init_default_directories_os2;
+static void (*init_default_directories)(MEM_ROOT *alloc)=
+  init_default_directories_os2;
 
 #else
 
@@ -1112,18 +1131,19 @@ static void (*init_default_directories)(
     5. "~/"
 */
 
-static void init_default_directories_unix()
+static void init_default_directories_unix(MEM_ROOT *alloc)
 {
   bzero((char *) default_directories, sizeof(default_directories));
-  ADD_DIRECTORY("/etc/");
+  ADD_DIRECTORY(alloc, "/etc/");
 #ifdef DEFAULT_SYSCONFDIR
   if (DEFAULT_SYSCONFDIR != "")
-    ADD_DIRECTORY(DEFAULT_SYSCONFDIR);
+    ADD_DIRECTORY(alloc, DEFAULT_SYSCONFDIR);
 #endif
-  ADD_COMMON_DIRECTORIES();
-  ADD_DIRECTORY("~/");
+  ADD_COMMON_DIRECTORIES(alloc);
+  ADD_DIRECTORY(alloc, "~/");
 }
 
-static void (*init_default_directories)()= init_default_directories_unix;
+static void (*init_default_directories)(MEM_ROOT *alloc)=
+  init_default_directories_unix;
 
 #endif
Thread
bk commit into 5.0 tree (tsmith:1.2576) BUG#20748tim22 Feb 2008
  • Re: bk commit into 5.0 tree (tsmith:1.2576) BUG#20748Sergei Golubchik26 Feb 2008
    • Re: bk commit into 5.0 tree (tsmith:1.2576) BUG#20748Timothy Smith26 Feb 2008
      • Re: bk commit into 5.0 tree (tsmith:1.2576) BUG#20748Sergei Golubchik29 Feb 2008