fix regexp sanity core
This commit is contained in:
@ -762,7 +762,7 @@ int ObExprRegexContext::get_valid_replace_string(ObIAllocator &alloc,
|
|||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
u_replace_len = 0;
|
u_replace_len = 0;
|
||||||
u_replace = NULL;
|
u_replace = NULL;
|
||||||
int32_t buf_len = origin_replace.empty() ? sizeof(UChar) : origin_replace.length();
|
int32_t buf_len = origin_replace.empty() ? sizeof(UChar) : origin_replace.length() * 2;
|
||||||
if (lib::is_mysql_mode()) {
|
if (lib::is_mysql_mode()) {
|
||||||
if (OB_FAIL(get_valid_unicode_string(alloc, origin_replace, u_replace, u_replace_len))) {
|
if (OB_FAIL(get_valid_unicode_string(alloc, origin_replace, u_replace, u_replace_len))) {
|
||||||
LOG_WARN("failed to get valid unicode string", K(ret));
|
LOG_WARN("failed to get valid unicode string", K(ret));
|
||||||
@ -788,6 +788,7 @@ int ObExprRegexContext::get_valid_replace_string(ObIAllocator &alloc,
|
|||||||
} else {
|
} else {
|
||||||
const UChar *tmp_buf = static_cast<const UChar *>((void*)origin_replace.ptr());
|
const UChar *tmp_buf = static_cast<const UChar *>((void*)origin_replace.ptr());
|
||||||
int32_t tmp_len = origin_replace.length() / sizeof(UChar);
|
int32_t tmp_len = origin_replace.length() / sizeof(UChar);
|
||||||
|
int32_t max_u_replace_len = buf_len / sizeof(UChar);
|
||||||
int32_t backslash_cnt = 0;
|
int32_t backslash_cnt = 0;
|
||||||
for (int64_t i = 0; i < tmp_len; ++i) {
|
for (int64_t i = 0; i < tmp_len; ++i) {
|
||||||
u_replace[u_replace_len++] = htons(static_cast<uint16_t>(tmp_buf[i]));
|
u_replace[u_replace_len++] = htons(static_cast<uint16_t>(tmp_buf[i]));
|
||||||
@ -802,7 +803,7 @@ int ObExprRegexContext::get_valid_replace_string(ObIAllocator &alloc,
|
|||||||
is_continue = false;
|
is_continue = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (i < tmp_len && u_replace_len < origin_replace.length()) {
|
if (i < tmp_len && u_replace_len < max_u_replace_len) {
|
||||||
if (backslash_cnt % 2 == 1 &&
|
if (backslash_cnt % 2 == 1 &&
|
||||||
static_cast<uint16_t>(u_replace[u_replace_len - 1]) >= 0x31 &&
|
static_cast<uint16_t>(u_replace[u_replace_len - 1]) >= 0x31 &&
|
||||||
static_cast<uint16_t>(u_replace[u_replace_len - 1]) <= 0x39) {//'\1'=>'$1'
|
static_cast<uint16_t>(u_replace[u_replace_len - 1]) <= 0x39) {//'\1'=>'$1'
|
||||||
@ -813,21 +814,21 @@ int ObExprRegexContext::get_valid_replace_string(ObIAllocator &alloc,
|
|||||||
} else {
|
} else {
|
||||||
u_replace[u_replace_len - 2] = 0x24;
|
u_replace[u_replace_len - 2] = 0x24;
|
||||||
}
|
}
|
||||||
} else if (u_replace_len < origin_replace.length()) {
|
} else if (u_replace_len < max_u_replace_len) {
|
||||||
uint16_t tmp_val = static_cast<uint16_t>(u_replace[u_replace_len - 1]);
|
uint16_t tmp_val = static_cast<uint16_t>(u_replace[u_replace_len - 1]);
|
||||||
u_replace[u_replace_len - 1] = 0x5c;
|
u_replace[u_replace_len - 1] = 0x5c;
|
||||||
u_replace[u_replace_len++] = tmp_val;
|
u_replace[u_replace_len++] = tmp_val;
|
||||||
}
|
}
|
||||||
} else if (backslash_cnt % 2 == 0 &&
|
} else if (backslash_cnt % 2 == 0 &&
|
||||||
static_cast<uint16_t>(u_replace[u_replace_len - 1]) == 0x24 &&
|
static_cast<uint16_t>(u_replace[u_replace_len - 1]) == 0x24 &&
|
||||||
u_replace_len < origin_replace.length()) {//'\\$' =>'\\\$'
|
u_replace_len < max_u_replace_len) {//'\\$' =>'\\\$'
|
||||||
u_replace[u_replace_len - 1] = 0x5c;
|
u_replace[u_replace_len - 1] = 0x5c;
|
||||||
u_replace[u_replace_len++] = 0x24;
|
u_replace[u_replace_len++] = 0x24;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
backslash_cnt = 0;
|
backslash_cnt = 0;
|
||||||
} else if (static_cast<uint16_t>(u_replace[u_replace_len - 1]) == 0x24 &&
|
} else if (static_cast<uint16_t>(u_replace[u_replace_len - 1]) == 0x24 &&
|
||||||
u_replace_len < origin_replace.length()) {//'$' ==>'\$'
|
u_replace_len < max_u_replace_len) {//'$' ==>'\$'
|
||||||
u_replace[u_replace_len - 1] = 0x5c;
|
u_replace[u_replace_len - 1] = 0x5c;
|
||||||
u_replace[u_replace_len++] = 0x24;
|
u_replace[u_replace_len++] = 0x24;
|
||||||
} else {//reset
|
} else {//reset
|
||||||
|
Reference in New Issue
Block a user