fix the possible interger overflow problem when decode handshake msg
This commit is contained in:
@ -121,29 +121,34 @@ int OMPKHandshakeResponse::decode()
|
|||||||
uint64_t key_len = 0;
|
uint64_t key_len = 0;
|
||||||
ret = ObMySQLUtil::get_length(pos, key_len, key_inc_len);
|
ret = ObMySQLUtil::get_length(pos, key_len, key_inc_len);
|
||||||
// OB_ASSERT(OB_SUCC(ret) && all_attrs_len > key_inc_len);
|
// OB_ASSERT(OB_SUCC(ret) && all_attrs_len > key_inc_len);
|
||||||
if (OB_SUCC(ret) && all_attrs_len > key_inc_len) {
|
if (OB_SUCC(ret) && all_attrs_len > key_inc_len && pos < end) {
|
||||||
all_attrs_len -= key_inc_len;
|
all_attrs_len -= key_inc_len;
|
||||||
str_kv.key_.assign_ptr(pos, static_cast<int32_t>(key_len));
|
str_kv.key_.assign_ptr(pos, static_cast<int32_t>(key_len));
|
||||||
// OB_ASSERT(all_attrs_len > key_len);
|
// OB_ASSERT(all_attrs_len > key_len);
|
||||||
if (all_attrs_len > key_len) {
|
if (all_attrs_len > key_len) {
|
||||||
all_attrs_len -= key_len;
|
all_attrs_len -= key_len;
|
||||||
|
if (end - pos > key_len) {
|
||||||
pos += key_len;
|
pos += key_len;
|
||||||
|
|
||||||
// get value
|
// get value
|
||||||
uint64_t value_inc_len = 0;
|
uint64_t value_inc_len = 0;
|
||||||
uint64_t value_len = 0;
|
uint64_t value_len = 0;
|
||||||
ret = ObMySQLUtil::get_length(pos, value_len, value_inc_len);
|
ret = ObMySQLUtil::get_length(pos, value_len, value_inc_len);
|
||||||
// OB_ASSERT(OB_SUCC(ret) && all_attrs_len > value_inc_len);
|
// OB_ASSERT(OB_SUCC(ret) && all_attrs_len > value_inc_len);
|
||||||
if (OB_SUCC(ret) && all_attrs_len > value_inc_len) {
|
if (OB_SUCC(ret) && all_attrs_len > value_inc_len && pos < end) {
|
||||||
all_attrs_len -= value_inc_len;
|
all_attrs_len -= value_inc_len;
|
||||||
str_kv.value_.assign_ptr(pos, static_cast<int32_t>(value_len));
|
str_kv.value_.assign_ptr(pos, static_cast<int32_t>(value_len));
|
||||||
// OB_ASSERT(all_attrs_len >= value_len);
|
// OB_ASSERT(all_attrs_len >= value_len);
|
||||||
if (all_attrs_len >= value_len) {
|
if (all_attrs_len >= value_len) {
|
||||||
all_attrs_len -= value_len;
|
all_attrs_len -= value_len;
|
||||||
|
if (end - pos >= value_len) {
|
||||||
pos += value_len;
|
pos += value_len;
|
||||||
if (OB_FAIL(connect_attrs_.push_back(str_kv))) {
|
if (OB_FAIL(connect_attrs_.push_back(str_kv))) {
|
||||||
LOG_WARN("fail to push back str_kv", K(str_kv), K(ret));
|
LOG_WARN("fail to push back str_kv", K(str_kv), K(ret));
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
ret = OB_INVALID_ARGUMENT;
|
||||||
|
LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(value_len), K((end - pos)));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = OB_INVALID_ARGUMENT;
|
ret = OB_INVALID_ARGUMENT;
|
||||||
LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(value_len));
|
LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(value_len));
|
||||||
@ -152,6 +157,10 @@ int OMPKHandshakeResponse::decode()
|
|||||||
ret = OB_INVALID_ARGUMENT;
|
ret = OB_INVALID_ARGUMENT;
|
||||||
LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(value_inc_len));
|
LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(value_inc_len));
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
ret = OB_INVALID_ARGUMENT;
|
||||||
|
LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(key_len), K((end - pos)));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = OB_INVALID_ARGUMENT;
|
ret = OB_INVALID_ARGUMENT;
|
||||||
LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(key_len));
|
LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(key_len));
|
||||||
|
|||||||
Reference in New Issue
Block a user