You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/07/25 07:11:02 UTC

[doris] branch master updated: [fix](config) Fix uninitialized config validator (#11022)

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 <10...@users.noreply.github.com>
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: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org