List:Commits« Previous MessageNext Message »
From:Petr Chardin Date:November 20 2006 2:51pm
Subject:bk commit into 5.1 tree (petr:1.2343) BUG#22242
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of cps. When cps 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, 2006-11-20 16:51:16+03:00, petr@stripped +1 -0
  Fix Bug #22242 Instance Manager: option-parsing errors
  
  There was a memory overrun, which resulted in safemalloc
  errors. Recommit with post-review fixes.

  server-tools/instance-manager/instance_options.cc@stripped, 2006-11-20 16:51:14+03:00,
petr@stripped +40 -6
    Memory was overrun here: convert_dirname() adds a slash to the
    end of the string. then it was removed (with end[-1]=0), but
    the overrun still happened, which caused sefemalloc to complain.
    
    The problem stemed from the fact that we converted the path to the
    binary, not the the directory. Now we first truncate the path and
    then convert the name of the directory, where the binary resides.
    
    E.g. Suppose that IM got an option --mysqld-path='/usr/local/bin/mysqld'.
    Then convert dirname was called. This routine takes a path to the
    dir (not binary!) and converts it for usage under particular OS.
    And at least for *nixes it *always* adds slash. E.g. for the path above
    convert_dirname() will result in path: '/usr/local/bin/mysqld/'
    Note the last slash. 
    
    The fix is to convert the path to the dir where the binary resides:
    /usr/local/bin/. Then we put back the binary name.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	petr
# Host:	outpost.site
# Root:	/home/cps/mysql/trees/mysql-5.1-runtime

--- 1.38/server-tools/instance-manager/instance_options.cc	2006-11-01 20:41:04 +03:00
+++ 1.39/server-tools/instance-manager/instance_options.cc	2006-11-20 16:51:14 +03:00
@@ -60,6 +60,19 @@
 }
 
 
+static char *find_last_path_separator(char *path, uint length)
+{
+  while (length)
+  {
+    if (path[length] == '\\' || path[length] == '/')
+      return path+length;
+    length--;
+  }
+  return NULL; /* No path separator found */
+}
+
+
+
 bool Instance_options::is_option_im_specific(const char *option_name)
 {
   static const char *IM_SPECIFIC_OPTIONS[] =
@@ -420,20 +433,41 @@
   int arg_idx;
   const char *tmp;
   char *end;
+  char bin_name_firstchar;
 
   if (!mysqld_path.str)
   {
-    // Need one extra byte, as convert_dirname() adds a slash at the end.
-    if (!(mysqld_path.str= alloc_root(&alloc, strlen(default_path) + 2)))
+    /*
+      Need to copy the path to allocated memory, as convert_dirname() might
+      need to change it
+    */
+    if (!(mysqld_path.str= alloc_root(&alloc, strlen(default_path) + 1)))
       goto err;
     strcpy(mysqld_path.str, default_path);
   }
 
-  // it's safe to cast this to char* since this is a buffer we are allocating
-  end= convert_dirname((char*)mysqld_path.str, mysqld_path.str, NullS);
-  end[-1]= 0;
-
   mysqld_path.length= strlen(mysqld_path.str);
+
+  /* path with no slashes found. looks like obvious error */
+  if (!(end= find_last_path_separator(mysqld_path.str, mysqld_path.length)))
+    goto err;
+
+  bin_name_firstchar= end[1];
+
+  /*
+    Below we will conver the path to mysqld in the case, it was given
+    in a format of another OS (e.g. uses '/' instead of '\' etc).
+    Here we strip the path to get rid of the binary name ("mysqld"),
+    we do it by removing first letter of the binary name (e.g. 'm'
+    in "mysqld"). Later we put it back.
+  */
+  end[1]= 0;
+
+  /* convert dirname to the format of current OS */
+  convert_dirname((char*)mysqld_path.str, mysqld_path.str, NullS);
+
+  /* put back the first character of the binary name*/
+  end[1]= bin_name_firstchar;
 
   if (mysqld_port)
     mysqld_port_val= atoi(mysqld_port);
Thread
bk commit into 5.1 tree (petr:1.2343) BUG#22242Petr Chardin20 Nov