Commit 4032c303 authored by unknown's avatar unknown
Browse files

Bug#22807 mysql_upgrade fails when called with a basedir-path containing spaces

- Corrected compiler warnings and performance problems with new 
dynstr_append_os_quoted function.


mysys/string.c:
  Bug#22807 mysql_upgrade fails when called with a basedir-path containing spaces
  - Fix compiler warnings.
  - Used dynstr_append_mem where string length is known.
parent b1bfec73
Loading
Loading
Loading
Loading
+13 −15
Original line number Diff line number Diff line
@@ -132,37 +132,35 @@ my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append,
my_bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append, ...)
{
#ifdef __WIN__
  char quote_str[]= "\"";
  const char *quote_str= "\"";
  const uint  quote_len= 1;
#else
  char quote_str[]= "\'";
  const char *quote_str= "\'";
  const uint  quote_len= 1;
#endif /* __WIN__ */
  my_bool ret= TRUE;
  va_list dirty_text;

  ret&= dynstr_append(str, quote_str);          /* Leading quote */
  ret&= dynstr_append_mem(str, quote_str, quote_len); /* Leading quote */
  va_start(dirty_text, append);
  while (append != NullS)
  {
    char *cur_pos=  append;
    char *next_pos= cur_pos;
    const char  *cur_pos= append;
    const char *next_pos= cur_pos;

    /* Search for quote in each string and replace with escaped quote */
    while(*(next_pos= strcend(cur_pos, quote_str[0])) != '\0')
    {
      char *tmp_buff= my_malloc((next_pos - cur_pos) + 1, MYF(MY_ZEROFILL));
      strnmov(tmp_buff, cur_pos, (next_pos - cur_pos));
      ret&= dynstr_append(str, tmp_buff);
      my_free((gptr)tmp_buff, MYF(0));

      ret&= dynstr_append(str ,"\\");
      ret&= dynstr_append(str, quote_str);
      ret&= dynstr_append_mem(str, cur_pos, next_pos - cur_pos);
      ret&= dynstr_append_mem(str ,"\\", 1);
      ret&= dynstr_append_mem(str, quote_str, quote_len);
      cur_pos= next_pos + 1;
    }
    ret&= dynstr_append(str, cur_pos);
    ret&= dynstr_append_mem(str, cur_pos, next_pos - cur_pos);
    append= va_arg(dirty_text, char *);
  }
  va_end(dirty_text);
  ret&= dynstr_append(str, quote_str);          /* Trailing quote */
  ret&= dynstr_append_mem(str, quote_str, quote_len); /* Trailing quote */

  return ret;
}