Commit 6fb66342 authored by unknown's avatar unknown
Browse files

Bug#23736 Pointer free error in mysqlbinlog

- Mis-matched SAFEMALLOC defines caused misleading error message.


client/mysqlbinlog.cc:
  Bug#23736 Pointer free error in mysqlbinlog
  - Re-worked the Load_log_processor so that it frees it's resources before 
  my_end is called.  This is necessary because SAFEMALLOC's _my_free calls
  pthread_mutex_lock() using THR_LOCK_malloc which is cleaned up in my_end().
include/my_sys.h:
  Bug#23736 Pointer free error in mysqlbinlog
  - Define DYNAMIC_ARRAY beofore MY_TMPDIR
  - Add DYNAMIC_ARRAY to MY_TMP_DIR
mysys/array.c:
  Bug#23736 Pointer free error in mysqlbinlog
  - SAFEMALLOC should not be unconditionally undef'd.
mysys/mf_tempdir.c:
  Bug#23736 Pointer free error in mysqlbinlog
  - Use struct's DYNAMIC_ARRAY.
  - Use DYNAMIC_ARRAY:delete_dynamic function instead of my_free
parent 996843e5
Loading
Loading
Loading
Loading
+13 −14
Original line number Diff line number Diff line
@@ -155,11 +155,7 @@ class Load_log_processor

public:
  Load_log_processor() {}
  ~Load_log_processor()
  {
    destroy();
    delete_dynamic(&file_names);
  }
  ~Load_log_processor() {}

  int init()
  {
@@ -191,6 +187,8 @@ class Load_log_processor
        bzero((char *)ptr, sizeof(File_name_record));
      }
    }

    delete_dynamic(&file_names);
  }

  /*
@@ -1517,6 +1515,7 @@ int main(int argc, char** argv)
  cleanup();
  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_DONT_FREE_DBUG);
  exit(exit_value);
+9 −8
Original line number Diff line number Diff line
@@ -322,8 +322,17 @@ struct st_my_file_info

extern struct st_my_file_info *my_file_info;

typedef struct st_dynamic_array
{
  char *buffer;
  uint elements,max_element;
  uint alloc_increment;
  uint size_of_element;
} DYNAMIC_ARRAY;

typedef struct st_my_tmpdir
{
  DYNAMIC_ARRAY full_list;
  char **list;
  uint cur, max;
#ifdef THREAD
@@ -331,14 +340,6 @@ typedef struct st_my_tmpdir
#endif
} MY_TMPDIR;

typedef struct st_dynamic_array
{
  char *buffer;
  uint elements,max_element;
  uint alloc_increment;
  uint size_of_element;
} DYNAMIC_ARRAY;

typedef struct st_dynamic_string
{
  char *str;
+0 −4
Original line number Diff line number Diff line
@@ -15,10 +15,6 @@

/* Handling of arrays that can grow dynamicly. */

#if defined(WIN32) || defined(__WIN__)
#undef SAFEMALLOC				/* Problems with threads */
#endif

#include "mysys_priv.h"
#include "m_string.h"

+6 −7
Original line number Diff line number Diff line
@@ -26,9 +26,8 @@ my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist)
{
  char *end, *copy;
  char buff[FN_REFLEN];
  DYNAMIC_ARRAY t_arr;
  pthread_mutex_init(&tmpdir->mutex, MY_MUTEX_INIT_FAST);
  if (my_init_dynamic_array(&t_arr, sizeof(char*), 1, 5))
  if (my_init_dynamic_array(&tmpdir->full_list, sizeof(char*), 1, 5))
    return TRUE;
  if (!pathlist || !pathlist[0])
  {
@@ -49,14 +48,14 @@ my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist)
    convert_dirname(buff, pathlist, end);
    if (!(copy=my_strdup(buff, MYF(MY_WME))))
      return TRUE;
    if (insert_dynamic(&t_arr, (gptr)&copy))
    if (insert_dynamic(&tmpdir->full_list, (gptr)&copy))
      return TRUE;
    pathlist=end+1;
  }
  while (*end);
  freeze_size(&t_arr);
  tmpdir->list=(char **)t_arr.buffer;
  tmpdir->max=t_arr.elements-1;
  freeze_size(&tmpdir->full_list);
  tmpdir->list=(char **)tmpdir->full_list.buffer;
  tmpdir->max=tmpdir->full_list.elements-1;
  tmpdir->cur=0;
  return FALSE;
}
@@ -76,7 +75,7 @@ void free_tmpdir(MY_TMPDIR *tmpdir)
  uint i;
  for (i=0; i<=tmpdir->max; i++)
    my_free(tmpdir->list[i], MYF(0));
  my_free((gptr)tmpdir->list, MYF(0));
  delete_dynamic(&tmpdir->full_list);
  pthread_mutex_destroy(&tmpdir->mutex);
}