This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 0d50a658f5 [fix](config) Fix uninitialized config validator (#11022)
0d50a658f5 is described below
commit 0d50a658f599e527b13350fa9527c6116d55ed0a
Author: Compilation Success <[email protected]>
AuthorDate: Mon Jul 25 15:10:55 2022 +0800
[fix](config) Fix uninitialized config validator (#11022)
* [fix](config) Fix uninitialized config validator
If we don't set any validator, the original implementation will cause
seg-fault due to nullptr of `RegisterConfValidator::_s_field_validator`,
which initial value relies on the first config validator definition.
We need to skip finding validator from
uninitialized `RegisterConfValidator::_s_field_validator`.
---
be/src/common/configbase.cpp | 67 +++++++++++++++++++++++---------------------
1 file changed, 35 insertions(+), 32 deletions(-)
diff --git a/be/src/common/configbase.cpp b/be/src/common/configbase.cpp
index 35d89a69e4..e06988265f 100644
--- a/be/src/common/configbase.cpp
+++ b/be/src/common/configbase.cpp
@@ -311,13 +311,15 @@ std::ostream& operator<<(std::ostream& out, const
std::vector<T>& v) {
TYPE& ref_conf_value = *reinterpret_cast<TYPE*>((FIELD).storage);
\
TYPE old_value = ref_conf_value;
\
ref_conf_value = new_value;
\
- auto validator =
RegisterConfValidator::_s_field_validator->find((FIELD).name); \
- if (validator != RegisterConfValidator::_s_field_validator->end() &&
\
- !(validator->second)()) {
\
- ref_conf_value = old_value;
\
- std::cerr << "validate " << (FIELD).name << "=" << new_value << "
failed" \
- << std::endl;
\
- return false;
\
+ if (RegisterConfValidator::_s_field_validator != nullptr) {
\
+ auto validator =
RegisterConfValidator::_s_field_validator->find((FIELD).name); \
+ if (validator != RegisterConfValidator::_s_field_validator->end()
&& \
+ !(validator->second)()) {
\
+ ref_conf_value = old_value;
\
+ std::cerr << "validate " << (FIELD).name << "=" << new_value
<< " failed" \
+ << std::endl;
\
+ return false;
\
+ }
\
}
\
if (FILL_CONF_MAP) {
\
std::ostringstream oss;
\
@@ -358,31 +360,32 @@ bool init(const char* conf_file, bool fill_conf_map, bool
must_exist, bool set_t
return true;
}
-#define UPDATE_FIELD(FIELD, VALUE, TYPE, PERSIST)
\
- if (strcmp((FIELD).type, #TYPE) == 0) {
\
- TYPE new_value;
\
- if (!convert((VALUE), new_value)) {
\
- return Status::InvalidArgument("convert '{}' as {} failed", VALUE,
#TYPE); \
- }
\
- TYPE& ref_conf_value = *reinterpret_cast<TYPE*>((FIELD).storage);
\
- TYPE old_value = ref_conf_value;
\
- ref_conf_value = new_value;
\
- auto validator =
RegisterConfValidator::_s_field_validator->find((FIELD).name); \
- if (validator != RegisterConfValidator::_s_field_validator->end() &&
\
- !(validator->second)()) {
\
- ref_conf_value = old_value;
\
- return Status::InvalidArgument("validate {}={} failed",
(FIELD).name, new_value); \
- }
\
- ref_conf_value = new_value;
\
- if (full_conf_map != nullptr) {
\
- std::ostringstream oss;
\
- oss << new_value;
\
- (*full_conf_map)[(FIELD).name] = oss.str();
\
- }
\
- if (PERSIST) {
\
- persist_config(std::string((FIELD).name), VALUE);
\
- }
\
- return Status::OK();
\
+#define UPDATE_FIELD(FIELD, VALUE, TYPE, PERSIST)
\
+ if (strcmp((FIELD).type, #TYPE) == 0) {
\
+ TYPE new_value;
\
+ if (!convert((VALUE), new_value)) {
\
+ return Status::InvalidArgument("convert '{}' as {} failed", VALUE,
#TYPE); \
+ }
\
+ TYPE& ref_conf_value = *reinterpret_cast<TYPE*>((FIELD).storage);
\
+ TYPE old_value = ref_conf_value;
\
+ if (RegisterConfValidator::_s_field_validator != nullptr) {
\
+ auto validator =
RegisterConfValidator::_s_field_validator->find((FIELD).name); \
+ if (validator != RegisterConfValidator::_s_field_validator->end()
&& \
+ !(validator->second)()) {
\
+ ref_conf_value = old_value;
\
+ return Status::InvalidArgument("validate {}={} failed",
(FIELD).name, new_value); \
+ }
\
+ }
\
+ ref_conf_value = new_value;
\
+ if (full_conf_map != nullptr) {
\
+ std::ostringstream oss;
\
+ oss << new_value;
\
+ (*full_conf_map)[(FIELD).name] = oss.str();
\
+ }
\
+ if (PERSIST) {
\
+ persist_config(std::string((FIELD).name), VALUE);
\
+ }
\
+ return Status::OK();
\
}
// write config to be_custom.conf
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]