Commit 3b7c799f authored by unknown's avatar unknown
Browse files

BUG#12659 error handling in federated needs improvement. Sanja pointed out...

BUG#12659 error handling in federated needs improvement. Sanja pointed out that we were copying an entire buffer, most of which was probably garbage, and possibly hidden by null termination in the middle of the buffer. Now we are only copying the error message.


sql/ha_federated.cc:
  now recording only the error message, and not additional garbage. Storing the buffer length.
sql/ha_federated.h:
  added buffer length variable
parent 8a661e77
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -2615,8 +2615,11 @@ int ha_federated::stash_remote_error()
{
  DBUG_ENTER("ha_federated::stash_remote_error()");
  remote_error_number= mysql_errno(mysql);
  my_snprintf(remote_error_buf, FEDERATED_QUERY_BUFFER_SIZE, 
              mysql_error(mysql));
  const char *remote_error= mysql_error(mysql);
  remote_error_len= strlen(remote_error);
  if(remote_error_len > (sizeof(remote_error_buf) - 1))
    remote_error_len= (sizeof(remote_error_buf) - 1);
  my_snprintf(remote_error_buf, remote_error_len + 1, remote_error);
  DBUG_RETURN(HA_FEDERATED_ERROR_WITH_REMOTE_SYSTEM);
}

@@ -2630,10 +2633,11 @@ bool ha_federated::get_error_message(int error, String* buf)
    buf->append("Error on remote system: ");
    buf->qs_append(remote_error_number);
    buf->append(": ");
    buf->append(remote_error_buf, FEDERATED_QUERY_BUFFER_SIZE);
    buf->append(remote_error_buf, remote_error_len);

    remote_error_number= 0;
    remote_error_buf[0]= '\0';
    remote_error_len= 0;
  }
  DBUG_PRINT("exit", ("message: %s", buf->ptr()));
  DBUG_RETURN(FALSE);
+1 −0
Original line number Diff line number Diff line
@@ -159,6 +159,7 @@ class ha_federated: public handler
  MYSQL_ROW_OFFSET current_position;  // Current position used by ::position()
  int remote_error_number;
  char remote_error_buf[FEDERATED_QUERY_BUFFER_SIZE];
  uint remote_error_len;

private:
  /*