mirror of
https://github.com/sogou/workflow.git
synced 2026-02-08 01:33:17 +08:00
Merge pull request #1358 from Barenboim/master
Update MySQL parser to fix OK package parsing bug.
This commit is contained in:
@@ -98,6 +98,8 @@ int MySQLMessage::append(const void *buf, size_t *size)
|
||||
{
|
||||
const void *stream_buf;
|
||||
size_t stream_len;
|
||||
size_t nleft = *size;
|
||||
size_t n;
|
||||
int ret;
|
||||
|
||||
cur_size_ += *size;
|
||||
@@ -107,17 +109,24 @@ int MySQLMessage::append(const void *buf, size_t *size)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = mysql_stream_write(buf, *size, stream_);
|
||||
if (ret > 0)
|
||||
while (nleft > 0)
|
||||
{
|
||||
seqid_ = mysql_stream_get_seq(stream_);
|
||||
mysql_stream_get_buf(&stream_buf, &stream_len, stream_);
|
||||
ret = decode_packet((const unsigned char *)stream_buf, stream_len);
|
||||
if (ret == -2)
|
||||
n = nleft;
|
||||
ret = mysql_stream_write(buf, &n, stream_);
|
||||
if (ret > 0)
|
||||
{
|
||||
errno = EBADMSG;
|
||||
ret = -1;
|
||||
seqid_ = mysql_stream_get_seq(stream_);
|
||||
mysql_stream_get_buf(&stream_buf, &stream_len, stream_);
|
||||
ret = decode_packet((const unsigned char *)stream_buf, stream_len);
|
||||
if (ret == -2)
|
||||
errno = EBADMSG;
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
|
||||
nleft -= n;
|
||||
buf = (const char *)buf + n;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -202,25 +202,18 @@ static int parse_ok_packet(const void *buf, size_t len, mysql_parser_t *parser)
|
||||
warning_count = uint2korr(p);
|
||||
p += 2;
|
||||
|
||||
if (server_status & MYSQL_SERVER_SESSION_STATE_CHANGED)
|
||||
{
|
||||
const unsigned char *tmp_str;
|
||||
unsigned long long tmp_len;
|
||||
|
||||
if (decode_string(&str, &info_len, &p, buf_end) == 0)
|
||||
return -2;
|
||||
|
||||
if (decode_string(&tmp_str, &tmp_len, &p, buf_end) == 0)
|
||||
return -2;
|
||||
|
||||
} else if (p != buf_end &&
|
||||
*p != MYSQL_PACKET_HEADER_OK &&
|
||||
*p != MYSQL_PACKET_HEADER_NULL &&
|
||||
*p != MYSQL_PACKET_HEADER_EOF &&
|
||||
*p != MYSQL_PACKET_HEADER_ERROR)
|
||||
if (p != buf_end)
|
||||
{
|
||||
if (decode_string(&str, &info_len, &p, buf_end) == 0)
|
||||
return -2;
|
||||
|
||||
if (server_status & MYSQL_SERVER_SESSION_STATE_CHANGED)
|
||||
{
|
||||
const unsigned char *tmp_str;
|
||||
unsigned long long tmp_len;
|
||||
if (decode_string(&tmp_str, &tmp_len, &p, buf_end) == 0)
|
||||
return -2;
|
||||
}
|
||||
} else {
|
||||
str = p;
|
||||
info_len = 0;
|
||||
|
||||
@@ -86,23 +86,6 @@ static int __mysql_stream_write_payload(const void *buf, size_t *n,
|
||||
return stream->payload_length != (1 << 24) - 1;
|
||||
}
|
||||
|
||||
int mysql_stream_write(const void *buf, size_t n, mysql_stream_t *stream)
|
||||
{
|
||||
size_t nleft = n;
|
||||
int ret;
|
||||
|
||||
while (1)
|
||||
{
|
||||
ret = stream->write(buf, &n, stream);
|
||||
if (nleft == n)
|
||||
return ret;
|
||||
|
||||
nleft -= n;
|
||||
buf = (const char *)buf + n;
|
||||
n = nleft;
|
||||
}
|
||||
}
|
||||
|
||||
void mysql_stream_init(mysql_stream_t *stream)
|
||||
{
|
||||
stream->head_left = 4;
|
||||
|
||||
@@ -40,12 +40,17 @@ extern "C"
|
||||
#endif
|
||||
|
||||
void mysql_stream_init(mysql_stream_t *stream);
|
||||
int mysql_stream_write(const void *buf, size_t n, mysql_stream_t *stream);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int mysql_stream_write(const void *buf, size_t *n,
|
||||
mysql_stream_t *stream)
|
||||
{
|
||||
return stream->write(buf, n, stream);
|
||||
}
|
||||
|
||||
static inline int mysql_stream_get_seq(mysql_stream_t *stream)
|
||||
{
|
||||
return stream->sequence_id;
|
||||
|
||||
Reference in New Issue
Block a user