fix encode sortkey out of bound
This commit is contained in:
@ -478,8 +478,16 @@ int ObOrderPerservingEncoder::encode_from_string_varlen(
|
|||||||
bool is_valid_uni = false;
|
bool is_valid_uni = false;
|
||||||
bool is_mem = lib::is_oracle_mode();
|
bool is_mem = lib::is_oracle_mode();
|
||||||
|
|
||||||
// tail is up to 8 byte, and src will only expand four times at most when encoding.
|
int64_t safety_buf_size = 20;
|
||||||
if ((to_len + 4 * str.length() + 8) > max_buf_len) {
|
// tail is up to 8 byte and [space] will be expand to 10byte,
|
||||||
|
// therefore safty buffer size round up to 20(byte)
|
||||||
|
// and src will only expand 7 times at most when encoding.
|
||||||
|
// for bad case
|
||||||
|
// [space] A [space] A
|
||||||
|
// [space] will expand to 10 byte
|
||||||
|
// A will expand to 4 byte
|
||||||
|
// therefore src will expand (10+4)/2=>7 times at most when encoding
|
||||||
|
if ((to_len + 7 * str.length() + safety_buf_size) > max_buf_len) {
|
||||||
ret = OB_BUF_NOT_ENOUGH;
|
ret = OB_BUF_NOT_ENOUGH;
|
||||||
LOG_TRACE("no enough memory to do encoding for string", K(ret));
|
LOG_TRACE("no enough memory to do encoding for string", K(ret));
|
||||||
} else if (str.empty() || (str.length()==1 && *str.ptr()=='\0')) {
|
} else if (str.empty() || (str.length()==1 && *str.ptr()=='\0')) {
|
||||||
@ -500,7 +508,8 @@ int ObOrderPerservingEncoder::encode_from_string_varlen(
|
|||||||
|| cs == CS_TYPE_GB18030_CHINESE_CI ||
|
|| cs == CS_TYPE_GB18030_CHINESE_CI ||
|
||||||
(CS_TYPE_GB18030_2022_PINYIN_CI <= cs && cs <= CS_TYPE_GB18030_2022_STROKE_CS)) {
|
(CS_TYPE_GB18030_2022_PINYIN_CI <= cs && cs <= CS_TYPE_GB18030_2022_STROKE_CS)) {
|
||||||
int64_t res_len = ObCharset::sortkey_var_len(cs, str.ptr(), str.length(), (char *)to,
|
int64_t res_len = ObCharset::sortkey_var_len(cs, str.ptr(), str.length(), (char *)to,
|
||||||
max_buf_len, is_mem, is_valid_uni);
|
max_buf_len - to_len - safety_buf_size,
|
||||||
|
is_mem, is_valid_uni);
|
||||||
if (res_len < 0) {
|
if (res_len < 0) {
|
||||||
ret = OB_NOT_SUPPORTED;
|
ret = OB_NOT_SUPPORTED;
|
||||||
LOG_TRACE("not support collation", K(cs));
|
LOG_TRACE("not support collation", K(cs));
|
||||||
@ -521,8 +530,16 @@ int ObOrderPerservingEncoder::encode_from_string_varlen(
|
|||||||
ObCollationType cs = param.cs_type_;
|
ObCollationType cs = param.cs_type_;
|
||||||
bool is_valid_uni = false;
|
bool is_valid_uni = false;
|
||||||
|
|
||||||
// tail is up to 8 byte, and src will only expand four times at most when encoding.
|
int64_t safty_buf_size = 20;
|
||||||
if ((to_len + 4 * str.length() + 8) > max_buf_len) {
|
// tail is up to 8 byte and [space] will be expand to 10byte,
|
||||||
|
// therefore safty buffer size round up to 20(byte)
|
||||||
|
// and src will only expand 7 times at most when encoding.
|
||||||
|
// for bad case
|
||||||
|
// [space] A [space] A
|
||||||
|
// [space] will expand to 10 byte
|
||||||
|
// A will expand to 4 byte
|
||||||
|
// therefore src will expand (10+4)/2=>7 times at most when encoding
|
||||||
|
if ((to_len + 7 * str.length() + safty_buf_size) > max_buf_len) {
|
||||||
ret = OB_BUF_NOT_ENOUGH;
|
ret = OB_BUF_NOT_ENOUGH;
|
||||||
LOG_TRACE("no enough memory to do encoding for string", K(ret));
|
LOG_TRACE("no enough memory to do encoding for string", K(ret));
|
||||||
} else if (str.empty() || (str.length()==1 && *str.ptr()=='\0')) {
|
} else if (str.empty() || (str.length()==1 && *str.ptr()=='\0')) {
|
||||||
@ -543,7 +560,8 @@ int ObOrderPerservingEncoder::encode_from_string_varlen(
|
|||||||
|| cs == CS_TYPE_GB18030_CHINESE_CI ||
|
|| cs == CS_TYPE_GB18030_CHINESE_CI ||
|
||||||
(CS_TYPE_GB18030_2022_PINYIN_CI <= cs && cs <= CS_TYPE_GB18030_2022_STROKE_CS)) {
|
(CS_TYPE_GB18030_2022_PINYIN_CI <= cs && cs <= CS_TYPE_GB18030_2022_STROKE_CS)) {
|
||||||
int64_t res_len = ObCharset::sortkey_var_len(cs, str.ptr(), str.length(), (char *)to,
|
int64_t res_len = ObCharset::sortkey_var_len(cs, str.ptr(), str.length(), (char *)to,
|
||||||
max_buf_len, param.is_memcmp_, param.is_valid_uni_);
|
max_buf_len - to_len - safty_buf_size,
|
||||||
|
param.is_memcmp_, param.is_valid_uni_);
|
||||||
if (!param.is_valid_uni_) {
|
if (!param.is_valid_uni_) {
|
||||||
// invalid unicode, do nothing
|
// invalid unicode, do nothing
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user