From d47e35a2f89d96657f1dcb520577efc7bbbb39a1 Mon Sep 17 00:00:00 2001 From: ym0 Date: Mon, 27 Sep 2021 21:44:02 +0800 Subject: [PATCH] fix ObKVParser problem --- src/share/ob_kv_parser.cpp | 13 +++++++++---- src/share/ob_kv_parser.h | 6 ++++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/share/ob_kv_parser.cpp b/src/share/ob_kv_parser.cpp index 0db86ed01..d79112d8e 100644 --- a/src/share/ob_kv_parser.cpp +++ b/src/share/ob_kv_parser.cpp @@ -115,13 +115,18 @@ int ObKVParser::parse(const char* data, int64_t data_length) { int ret = OB_SUCCESS; bool finish = false; - if (OB_ISNULL(data)) { + const int64_t length = data_length + 1; + if (OB_ISNULL(data) || data_length <= 0) { ret = OB_INVALID_ARGUMENT; LOG_WARN("null data ptr", K(ret)); + } else if (OB_ISNULL(data_ = static_cast(allocator_.alloc(length)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to alloc memory", K(ret), K(length)); } else { - cur_ = data; - data_length_ = data_length; - data_ = data; + MEMSET(data_, '\0', length); + STRNCPY(data_, data, data_length); + cur_ = data_; + data_length_ = length; if (OB_FAIL(get_token())) { LOG_WARN("failed to get_token", K(ret)); } diff --git a/src/share/ob_kv_parser.h b/src/share/ob_kv_parser.h index c36b4b8ac..e5bcddc40 100644 --- a/src/share/ob_kv_parser.h +++ b/src/share/ob_kv_parser.h @@ -14,6 +14,7 @@ #define __OCEANBASE_SHARE_KV_PARSER_H__ #include "share/ob_define.h" +#include "lib/allocator/page_arena.h" namespace oceanbase { namespace share { @@ -85,10 +86,11 @@ private: char key_buf_[MAX_TOKEN_SIZE]; char value_buf_[MAX_TOKEN_SIZE]; const char* cur_; - const char* data_; // Raw data - int64_t data_length_; // Original data length + char* data_; + int64_t data_length_; // Call back every time a KV pair is parsed ObKVMatchCb* cb_; + common::ObArenaAllocator allocator_; DISALLOW_COPY_AND_ASSIGN(ObKVParser); };