Fix CDC error detection

The error detection assumed the buffer was null-terminated which was never
guaranteed.
This commit is contained in:
Markus Mäkelä
2018-08-27 12:11:42 +03:00
parent 02a65f311a
commit 01e1c616ba
2 changed files with 11 additions and 10 deletions

View File

@ -523,14 +523,14 @@ bool Connection::do_registration()
return rval; return rval;
} }
bool Connection::is_error(const char* str) bool Connection::is_error()
{ {
bool rval = false; bool rval = false;
if (str[0] == 'E' && str[1] == 'R' && str[2] == 'R') if (m_buffer.size() >= 3 && m_buffer[0] == 'E' && m_buffer[1] == 'R' && m_buffer[2] == 'R')
{ {
m_error = "MaxScale responded with an error: "; m_error = "MaxScale responded with an error: ";
m_error += str; m_error.append(m_buffer.begin(), m_buffer.end());
rval = true; rval = true;
} }
@ -545,6 +545,12 @@ bool Connection::read_row(std::string& dest)
{ {
if (!m_buffer.empty()) if (!m_buffer.empty())
{ {
if (is_error())
{
rval = false;
break;
}
std::deque<char>::iterator it = std::find(m_buffer.begin(), m_buffer.end(), '\n'); std::deque<char>::iterator it = std::find(m_buffer.begin(), m_buffer.end(), '\n');
if (it != m_buffer.end()) if (it != m_buffer.end())
@ -577,18 +583,13 @@ bool Connection::read_row(std::string& dest)
assert(std::find(m_buffer.begin(), m_buffer.end(), '\n') == m_buffer.end()); assert(std::find(m_buffer.begin(), m_buffer.end(), '\n') == m_buffer.end());
std::copy(buf, buf + rc, std::back_inserter(m_buffer)); std::copy(buf, buf + rc, std::back_inserter(m_buffer));
if (is_error(&m_buffer[0])) if (is_error())
{ {
rval = false; rval = false;
break; break;
} }
} }
if (is_error(dest.c_str()))
{
rval = false;
}
return rval; return rval;
} }

View File

@ -147,7 +147,7 @@ private:
bool read_row(std::string& dest); bool read_row(std::string& dest);
void process_schema(json_t* json); void process_schema(json_t* json);
SRow process_row(json_t*); SRow process_row(json_t*);
bool is_error(const char* str); bool is_error();
// Lower-level functions // Lower-level functions
int wait_for_event(short events); int wait_for_event(short events);