[CP] [4.1] fix tx-route state serialize size overflow
This commit is contained in:
@ -279,6 +279,7 @@ int ObMPUtils::append_modfied_sess_info(common::ObIAllocator &allocator,
|
|||||||
} else if (encoder->is_changed_) {
|
} else if (encoder->is_changed_) {
|
||||||
int16_t info_type = (int16_t)i;
|
int16_t info_type = (int16_t)i;
|
||||||
int32_t info_len = sess_size[i];
|
int32_t info_len = sess_size[i];
|
||||||
|
int64_t info_pos = 0;
|
||||||
LOG_DEBUG("session-info-encode", K(sess.get_sessid()), K(info_type), K(info_len));
|
LOG_DEBUG("session-info-encode", K(sess.get_sessid()), K(info_type), K(info_len));
|
||||||
if (info_len < 0) {
|
if (info_len < 0) {
|
||||||
ret = OB_INVALID_ARGUMENT;
|
ret = OB_INVALID_ARGUMENT;
|
||||||
@ -287,10 +288,14 @@ int ObMPUtils::append_modfied_sess_info(common::ObIAllocator &allocator,
|
|||||||
// invalid info len do nothing and skip it.
|
// invalid info len do nothing and skip it.
|
||||||
encoder->is_changed_ = false;
|
encoder->is_changed_ = false;
|
||||||
} else if (OB_FAIL(ObProtoTransUtil::store_type_and_len(buf, size, pos, info_type, info_len))) {
|
} else if (OB_FAIL(ObProtoTransUtil::store_type_and_len(buf, size, pos, info_type, info_len))) {
|
||||||
LOG_WARN("failed to set type and len", K(info_type), K(info_len), K(ret));
|
LOG_WARN("failed to set type and len", K(ret), K(info_type), K(info_len), K(pos));
|
||||||
} else if (OB_FAIL(encoder->serialize(sess, buf, size, pos))) {
|
} else if (pos + info_len > size) {
|
||||||
LOG_WARN("failed to serialize", K(sess), K(ret), K(size), K(pos));
|
ret = OB_SIZE_OVERFLOW;
|
||||||
|
LOG_WARN("buf overflow for info", K(ret), K(buf), K(pos), K(info_type), K(info_len), K(size));
|
||||||
|
} else if (OB_FAIL(encoder->serialize(sess, buf + pos, info_len, info_pos))) {
|
||||||
|
LOG_WARN("failed to serialize", K(sess), K(ret), K(size), K(buf), K(pos), K(info_type), K(info_len), K(info_pos));
|
||||||
} else {
|
} else {
|
||||||
|
pos += info_len;
|
||||||
// reset to not changed
|
// reset to not changed
|
||||||
encoder->is_changed_ = false;
|
encoder->is_changed_ = false;
|
||||||
}
|
}
|
||||||
@ -335,6 +340,12 @@ int ObMPUtils::append_modfied_sess_info(common::ObIAllocator &allocator,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (OB_FAIL(ret)) {
|
||||||
|
// dump info size array
|
||||||
|
for (int i = 0; i< SESSION_SYNC_MAX_TYPE; i++) {
|
||||||
|
LOG_INFO("dump sess info size", "type", i, "size", sess_size[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -199,14 +199,12 @@ public:
|
|||||||
|
|
||||||
int64_t TxStateHeader::encode_length()
|
int64_t TxStateHeader::encode_length()
|
||||||
{
|
{
|
||||||
int64_t l = encoded_length_i64(1)
|
int64_t l = encoded_length_i64(1) // tx_id_
|
||||||
+ encoded_length_i64(1)
|
+ encoded_length_i64(1) // global_version_
|
||||||
+ encoded_length_i8(1);
|
+ encoded_length_i8(1) // flag_
|
||||||
if (with_version_()) {
|
+ encoded_length_i16(100) // length_
|
||||||
l += encoded_length_i16(100); // length
|
+ encoded_length_i8(1) // version_
|
||||||
l += encoded_length_i8(1); // version
|
+ encoded_length_i32(1); // backend_sess_id_
|
||||||
l += encoded_length_i32(1); // backend_sess_id
|
|
||||||
}
|
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -423,8 +423,7 @@ int MockObServer::handle(ObReq &req, ObResp &resp)
|
|||||||
OB_FAIL(tx_node_.txn_free_route__update_##tn##_state(session_.get_sessid(), tx_desc, free_route_ctx, buf, len, pos))) { \
|
OB_FAIL(tx_node_.txn_free_route__update_##tn##_state(session_.get_sessid(), tx_desc, free_route_ctx, buf, len, pos))) { \
|
||||||
TRANS_LOG(ERROR, "update txn state fail", K(ret), "type", #T); \
|
TRANS_LOG(ERROR, "update txn state fail", K(ret), "type", #T); \
|
||||||
} else if (pos != len) { \
|
} else if (pos != len) { \
|
||||||
ret = OB_ERR_UNEXPECTED; \
|
TRANS_LOG(WARN, "[maybe] pos != len, consume buffer incomplete", K(ret), K(pos), K(len), "state_type", #T); \
|
||||||
TRANS_LOG(ERROR, "oops: pos != len, consume buffer incomplete", K(ret), K(pos), K(len), "state_type", #T); \
|
|
||||||
} \
|
} \
|
||||||
break;
|
break;
|
||||||
#define TX_STATE_UPDATE_(T, tn) TX_STATE_UPDATE__(T, tn)
|
#define TX_STATE_UPDATE_(T, tn) TX_STATE_UPDATE__(T, tn)
|
||||||
|
Reference in New Issue
Block a user