diff --git a/src/protocol/mysql_byteorder.c b/src/protocol/mysql_byteorder.c index 47de046d..7b8b0c4d 100644 --- a/src/protocol/mysql_byteorder.c +++ b/src/protocol/mysql_byteorder.c @@ -58,6 +58,9 @@ int decode_length_safe(unsigned long long *res, const unsigned char **pos, *res = uint8korr(p + 1); *pos = p + 9; break; + + case 255: + return -1; } return 1; @@ -68,7 +71,7 @@ int decode_string(const unsigned char **str, unsigned long long *len, { unsigned long long length; - if (decode_length_safe(&length, pos, end) == 0) + if (decode_length_safe(&length, pos, end) <= 0) return 0; if (length == 0 || length == (~0ULL)) diff --git a/src/protocol/mysql_parser.c b/src/protocol/mysql_parser.c index 48b6ebe6..187a4c21 100644 --- a/src/protocol/mysql_parser.c +++ b/src/protocol/mysql_parser.c @@ -182,10 +182,10 @@ static int parse_ok_packet(const void *buf, size_t len, mysql_parser_t *parser) int ret; p += 1;// 0x00 - if (decode_length_safe(&affected_rows, &p, buf_end) == 0) + if (decode_length_safe(&affected_rows, &p, buf_end) <= 0) return -2; - if (decode_length_safe(&insert_id, &p, buf_end) == 0) + if (decode_length_safe(&insert_id, &p, buf_end) <= 0) return -2; if (p + 4 > buf_end) @@ -199,10 +199,20 @@ static int parse_ok_packet(const void *buf, size_t len, mysql_parser_t *parser) if (p < buf_end) { ret = decode_length_safe(&info_len, &p, buf_end); - info_len = (info_len == (unsigned long long)-1) ? 0 : info_len; - if (ret == 0 || p + info_len > buf_end) + if (ret > 0) + { + if (info_len == ~0ULL) + info_len = 0; + if (p + info_len > buf_end) + return -2; + } + else if (ret < 0) + info_len = 0; + else return -2; + } else { + ret = 1; info_len = 0; } @@ -212,9 +222,8 @@ static int parse_ok_packet(const void *buf, size_t len, mysql_parser_t *parser) result_set->info_offset = p - (const unsigned char *)buf; result_set->info_len = info_len; - result_set->affected_rows = (affected_rows == (unsigned long long)-1) ? - 0 : affected_rows; - result_set->insert_id = (insert_id == (unsigned long long)-1) ? 0 : insert_id; + result_set->affected_rows = (affected_rows == ~0ULL) ? 0 : affected_rows; + result_set->insert_id = (insert_id == ~0ULL) ? 0 : insert_id; result_set->server_status = server_status; result_set->warning_count = warning_count; result_set->type = MYSQL_PACKET_OK; @@ -228,6 +237,12 @@ static int parse_ok_packet(const void *buf, size_t len, mysql_parser_t *parser) parser->buf = buf; parser->offset = result_set->info_offset + result_set->info_len; + if (ret < 0) + { + parser->parse = parse_error_packet; + return 0; + } + if (server_status & MYSQL_SERVER_MORE_RESULTS_EXIST) { parser->parse = parse_base_packet; @@ -337,13 +352,11 @@ static int parse_field_count(const void *buf, size_t len, mysql_parser_t *parser unsigned long long field_count; struct __mysql_result_set *result_set; - int ret; - ret = decode_length_safe(&field_count, &p, buf_end); - if (ret == 0) + if (decode_length_safe(&field_count, &p, buf_end) <= 0) return -2; - field_count = (field_count == (unsigned long long)-1) ? 0 : field_count; + field_count = (field_count == ~0ULL) ? 0 : field_count; if (field_count) { diff --git a/src/protocol/mysql_parser.h b/src/protocol/mysql_parser.h index 6f0cb9f1..ba92ecac 100644 --- a/src/protocol/mysql_parser.h +++ b/src/protocol/mysql_parser.h @@ -63,25 +63,18 @@ struct __mysql_result_set struct list_head list; int type; int server_status; - union - { - struct - { - int field_count; - int row_count; - size_t rows_begin_offset; - size_t rows_end_offset; - mysql_field_t **fields; - }; - struct - { - unsigned long long affected_rows; - unsigned long long insert_id; - int warning_count; - size_t info_offset; - int info_len; - }; - }; + + int field_count; + int row_count; + size_t rows_begin_offset; + size_t rows_end_offset; + mysql_field_t **fields; + + unsigned long long affected_rows; + unsigned long long insert_id; + int warning_count; + size_t info_offset; + int info_len; }; typedef struct __mysql_result_set_cursor diff --git a/tutorial/tutorial-12-mysql_cli.cc b/tutorial/tutorial-12-mysql_cli.cc index 2ed4c930..20504696 100644 --- a/tutorial/tutorial-12-mysql_cli.cc +++ b/tutorial/tutorial-12-mysql_cli.cc @@ -183,7 +183,7 @@ void mysql_callback(WFMySQLTask *task) fprintf(stderr, " __________ ROW END __________\n"); } } - else if (cursor.get_cursor_status() == MYSQL_PACKET_OK) + else if (cursor.get_cursor_status() == MYSQL_STATUS_OK) { fprintf(stderr, " OK. %llu ", cursor.get_affected_rows()); if (cursor.get_affected_rows() == 1)