fix memory out of bounds

This commit is contained in:
obdev
2021-07-11 20:05:12 +08:00
committed by wangzelin.wzl
parent 7dcf2baa4e
commit 5b403f4e84

View File

@ -56,158 +56,241 @@ class ObFIFOAllocator;
class ObPLogItem; class ObPLogItem;
#define OB_LOGGER ::oceanbase::common::ObLogger::get_logger() #define OB_LOGGER ::oceanbase::common::ObLogger::get_logger()
#define OB_LOG_NEED_TO_PRINT(level) OB_LOGGER.need_to_print(OB_LOG_LEVEL_##level) #define OB_LOG_NEED_TO_PRINT(level) (OB_UNLIKELY(OB_LOGGER.need_to_print(OB_LOG_LEVEL_##level)))
#define OB_T_TO_STRING_BODY_1 \ #define OB_T_TO_STRING_BODY_1 \
char* buf1 = buf + MAX(__pos, 0); \ char *buf1 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key1, false, obj1); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key1, false, obj1))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_2 \ #define OB_T_TO_STRING_BODY_2 \
OB_T_TO_STRING_BODY_1 \ OB_T_TO_STRING_BODY_1 \
char* buf2 = buf + MAX(__pos, 0); \ char *buf2 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key2, false, obj2); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key2, false, obj2))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_3 \ #define OB_T_TO_STRING_BODY_3 \
OB_T_TO_STRING_BODY_2 \ OB_T_TO_STRING_BODY_2 \
char* buf3 = buf + MAX(__pos, 0); \ char *buf3 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key3, false, obj3); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key3, false, obj3))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_4 \ #define OB_T_TO_STRING_BODY_4 \
OB_T_TO_STRING_BODY_3 \ OB_T_TO_STRING_BODY_3 \
char* buf4 = buf + MAX(__pos, 0); \ char *buf4 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key4, false, obj4); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key4, false, obj4))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_5 \ #define OB_T_TO_STRING_BODY_5 \
OB_T_TO_STRING_BODY_4 \ OB_T_TO_STRING_BODY_4 \
char* buf5 = buf + MAX(__pos, 0); \ char *buf5 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key5, false, obj5); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key5, false, obj5))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_6 \ #define OB_T_TO_STRING_BODY_6 \
OB_T_TO_STRING_BODY_5 \ OB_T_TO_STRING_BODY_5 \
char* buf6 = buf + MAX(__pos, 0); \ char *buf6 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key6, false, obj6); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key6, false, obj6))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_7 \ #define OB_T_TO_STRING_BODY_7 \
OB_T_TO_STRING_BODY_6 \ OB_T_TO_STRING_BODY_6 \
char* buf7 = buf + MAX(__pos, 0); \ char *buf7 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key7, false, obj7); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key7, false, obj7))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_8 \ #define OB_T_TO_STRING_BODY_8 \
OB_T_TO_STRING_BODY_7 \ OB_T_TO_STRING_BODY_7 \
char* buf8 = buf + MAX(__pos, 0); \ char *buf8 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key8, false, obj8); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key8, false, obj8))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_9 \ #define OB_T_TO_STRING_BODY_9 \
OB_T_TO_STRING_BODY_8 \ OB_T_TO_STRING_BODY_8 \
char* buf9 = buf + MAX(__pos, 0); \ char *buf9 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key9, false, obj9); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key9, false, obj9))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_10 \ #define OB_T_TO_STRING_BODY_10 \
OB_T_TO_STRING_BODY_9 \ OB_T_TO_STRING_BODY_9 \
char* buf10 = buf + MAX(__pos, 0); \ char *buf10 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key10, false, obj10); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key10, false, obj10))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_11 \ #define OB_T_TO_STRING_BODY_11 \
OB_T_TO_STRING_BODY_10 \ OB_T_TO_STRING_BODY_10 \
char* buf11 = buf + MAX(__pos, 0); \ char *buf11 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key11, false, obj11); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key11, false, obj11))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_12 \ #define OB_T_TO_STRING_BODY_12 \
OB_T_TO_STRING_BODY_11 \ OB_T_TO_STRING_BODY_11 \
char* buf12 = buf + MAX(__pos, 0); \ char *buf12 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key12, false, obj12); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key12, false, obj12))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_13 \ #define OB_T_TO_STRING_BODY_13 \
OB_T_TO_STRING_BODY_12 \ OB_T_TO_STRING_BODY_12 \
char* buf13 = buf + MAX(__pos, 0); \ char *buf13 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key13, false, obj13); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key13, false, obj13))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_14 \ #define OB_T_TO_STRING_BODY_14 \
OB_T_TO_STRING_BODY_13 \ OB_T_TO_STRING_BODY_13 \
char* buf14 = buf + MAX(__pos, 0); \ char *buf14 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key14, false, obj14); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key14, false, obj14))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_15 \ #define OB_T_TO_STRING_BODY_15 \
OB_T_TO_STRING_BODY_14 \ OB_T_TO_STRING_BODY_14 \
char* buf15 = buf + MAX(__pos, 0); \ char *buf15 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key15, false, obj15); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key15, false, obj15))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_16 \ #define OB_T_TO_STRING_BODY_16 \
OB_T_TO_STRING_BODY_15 \ OB_T_TO_STRING_BODY_15 \
char* buf16 = buf + MAX(__pos, 0); \ char *buf16 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key16, false, obj16); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key16, false, obj16))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_17 \ #define OB_T_TO_STRING_BODY_17 \
OB_T_TO_STRING_BODY_16 \ OB_T_TO_STRING_BODY_16 \
char* buf17 = buf + MAX(__pos, 0); \ char *buf17 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key17, false, obj17); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key17, false, obj17))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_18 \ #define OB_T_TO_STRING_BODY_18 \
OB_T_TO_STRING_BODY_17 \ OB_T_TO_STRING_BODY_17 \
char* buf18 = buf + MAX(__pos, 0); \ char *buf18 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key18, false, obj18); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key18, false, obj18))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_19 \ #define OB_T_TO_STRING_BODY_19 \
OB_T_TO_STRING_BODY_18 \ OB_T_TO_STRING_BODY_18 \
char* buf19 = buf + MAX(__pos, 0); \ char *buf19 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key19, false, obj19); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key19, false, obj19))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_20 \ #define OB_T_TO_STRING_BODY_20 \
OB_T_TO_STRING_BODY_19 \ OB_T_TO_STRING_BODY_19 \
char* buf20 = buf + MAX(__pos, 0); \ char *buf20 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key20, false, obj20); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key20, false, obj20))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_21 \ #define OB_T_TO_STRING_BODY_21 \
OB_T_TO_STRING_BODY_20 \ OB_T_TO_STRING_BODY_20 \
char* buf21 = buf + MAX(__pos, 0); \ char *buf21 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key21, false, obj21); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key21, false, obj21))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define OB_T_TO_STRING_BODY_22 \ #define OB_T_TO_STRING_BODY_22 \
OB_T_TO_STRING_BODY_21 \ OB_T_TO_STRING_BODY_21 \
char* buf22 = buf + MAX(__pos, 0); \ char *buf22 = buf + MAX(__pos, 0); \
ret = ::oceanbase::common::logdata_print_key_obj(buf, buf_size, __pos, key22, false, obj22); \ if (OB_FAIL(ret)) { \
buf[__pos++] = '\0'; } else if (OB_FAIL(::oceanbase::common::logdata_print_key_obj(buf, buf_size - 1, __pos, key22, false, obj22))) { \
} else if (__pos + 1 >= buf_size) { \
} else { \
buf[__pos++] = '\0'; \
}
#define DEFINE_OB_PRINT_KV(n) \ #define DEFINE_OB_PRINT_KV(n) \
template <LOG_TYPENAME_TN##n> \ template <LOG_TYPENAME_TN##n> \
void OB_PRINT(const char* mod_name, \ void OB_PRINT(const char *mod_name, const int32_t level, const char *file, const int32_t line, \
const int32_t level, \ const char *function, const uint64_t location_hash_val, const char *info_string, \
const char* file, \
const int32_t line, \
const char* function, \
const uint64_t location_hash_val, \
const char* info_string, \
LOG_PARAMETER_KV##n) \ LOG_PARAMETER_KV##n) \
{ \ { \
int64_t __pos = 0; \ int64_t __pos = 0; \
int ret = OB_SUCCESS; \ int ret = OB_SUCCESS; \
if (OB_LIKELY(!OB_LOGGER.get_guard())) { \ if (OB_LIKELY(!OB_LOGGER.get_guard())) { \
OB_LOGGER.get_guard() = true; \ OB_LOGGER.get_guard() = true; \
char* buf = ::oceanbase::common::ObLogger::get_small_buffer(); \ char *buf = ::oceanbase::common::ObLogger::get_small_buffer(); \
const int64_t buf_size = ::oceanbase::common::ObLogger::OB_SMALL_LOG_BUFFER_SIZE - 1; \ const int64_t buf_size = ::oceanbase::common::ObLogger::OB_SMALL_LOG_BUFFER_SIZE; \
OB_T_TO_STRING_BODY_##n OB_LOGGER.log_message_kv( \ OB_T_TO_STRING_BODY_##n \
mod_name, level, file, line, function, location_hash_val, info_string, EXPAND_ARGUMENT_##n(buf)); \ OB_LOGGER.log_message_kv(mod_name, level, file, line, function, location_hash_val, \
info_string, EXPAND_ARGUMENT_##n(buf)); \
OB_LOGGER.get_guard() = false; \ OB_LOGGER.get_guard() = false; \
UNUSED(ret); \ UNUSED(ret); \
} \ } \