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/28 07:56:55 UTC

[doris] branch dev-1.1.2 updated: [fix](be): fix stack overflow in unhex function (#11204) (#11291)

This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch dev-1.1.2
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/dev-1.1.2 by this push:
     new ee83ab908e [fix](be): fix stack overflow in unhex function (#11204) (#11291)
ee83ab908e is described below

commit ee83ab908e261305b19a254e7d57905ce85728bc
Author: yiguolei <67...@qq.com>
AuthorDate: Thu Jul 28 15:56:49 2022 +0800

    [fix](be): fix stack overflow in unhex function (#11204) (#11291)
    
    * [fix](be): fix stack overflow in unhex function
    
    Co-authored-by: spaces-x <we...@gmail.com>
---
 be/src/exprs/math_functions.cpp       |   5 +-
 be/src/udf/udf.cpp                    |   4 +-
 be/src/udf/udf.h                      |   4 +-
 be/test/exprs/math_functions_test.cpp | 123 ++++++++++++++--------------------
 4 files changed, 58 insertions(+), 78 deletions(-)

diff --git a/be/src/exprs/math_functions.cpp b/be/src/exprs/math_functions.cpp
index 13fe610971..db084fa831 100644
--- a/be/src/exprs/math_functions.cpp
+++ b/be/src/exprs/math_functions.cpp
@@ -377,7 +377,8 @@ StringVal MathFunctions::unhex(FunctionContext* ctx, const StringVal& s) {
     }
 
     int result_len = s.len / 2;
-    char result[result_len];
+    StringVal result_string_val(ctx, result_len);
+    char* result = reinterpret_cast<char*>(result_string_val.ptr);
     int res_index = 0;
     int s_index = 0;
     while (s_index < s.len) {
@@ -422,7 +423,7 @@ StringVal MathFunctions::unhex(FunctionContext* ctx, const StringVal& s) {
         result[res_index] = c;
         ++res_index;
     }
-    return AnyValUtil::from_buffer_temp(ctx, result, result_len);
+    return result_string_val;
 }
 
 StringVal MathFunctions::conv_int(FunctionContext* ctx, const BigIntVal& num,
diff --git a/be/src/udf/udf.cpp b/be/src/udf/udf.cpp
index 6fb8e53a0e..ea97c3848f 100644
--- a/be/src/udf/udf.cpp
+++ b/be/src/udf/udf.cpp
@@ -217,11 +217,11 @@ void FunctionContextImpl::derialize(const PFunctionContext& pcontext) {}
 namespace doris_udf {
 static const int MAX_WARNINGS = 1000;
 
-FunctionContext* FunctionContext::create_test_context() {
+FunctionContext* FunctionContext::create_test_context(doris::MemPool* mem_pool = nullptr) {
     FunctionContext* context = new FunctionContext();
     context->impl()->_debug = true;
     context->impl()->_state = nullptr;
-    context->impl()->_pool = new doris::FreePool(nullptr);
+    context->impl()->_pool = new doris::FreePool(mem_pool);
     return context;
 }
 
diff --git a/be/src/udf/udf.h b/be/src/udf/udf.h
index 481f19a14e..5134b605e3 100644
--- a/be/src/udf/udf.h
+++ b/be/src/udf/udf.h
@@ -35,6 +35,7 @@ class BitmapValue;
 class DecimalV2Value;
 class DateTimeValue;
 struct CollectionValue;
+class MemPool;
 } // namespace doris
 
 namespace doris_udf {
@@ -238,7 +239,8 @@ public:
 
     // Create a test FunctionContext object. The caller is responsible for calling delete
     // on it. This context has additional debugging validation enabled.
-    static FunctionContext* create_test_context();
+    // And the default value of mem_pool is nullprt.
+    static FunctionContext* create_test_context(doris::MemPool* mem_pool);
 
     ~FunctionContext();
 
diff --git a/be/test/exprs/math_functions_test.cpp b/be/test/exprs/math_functions_test.cpp
index c9008d89ad..751f8f8fee 100644
--- a/be/test/exprs/math_functions_test.cpp
+++ b/be/test/exprs/math_functions_test.cpp
@@ -24,6 +24,8 @@
 
 #include "exprs/anyval_util.h"
 #include "exprs/expr_context.h"
+#include "runtime/large_int_value.h"
+#include "runtime/mem_pool.h"
 #include "test_util/test_util.h"
 #include "testutil/function_utils.h"
 #include "util/logging.h"
@@ -171,100 +173,75 @@ TEST_F(MathFunctionsTest, rand) {
 
 TEST_F(MathFunctionsTest, hex_int) {
     doris_udf::FunctionContext* context = new doris_udf::FunctionContext();
-    
-    ASSERT_EQ(StringVal::null(),
-              MathFunctions::hex_string(context, StringVal::null()));
-    
-    ASSERT_EQ(StringVal("7FFFFFFFFFFFFFFF"),
-              MathFunctions::hex_int(context, BigIntVal(9223372036854775807))); //BigIntVal max_value
-    
+
+    ASSERT_EQ(StringVal::null(), MathFunctions::hex_string(context, StringVal::null()));
+
+    ASSERT_EQ(
+            StringVal("7FFFFFFFFFFFFFFF"),
+            MathFunctions::hex_int(context, BigIntVal(9223372036854775807))); //BigIntVal max_value
+
     ASSERT_EQ(StringVal("FFE5853AB393E6C0"),
               MathFunctions::hex_int(context, BigIntVal(-7453337203775808)));
-    
-    ASSERT_EQ(StringVal("0"),
-              MathFunctions::hex_int(context, BigIntVal(0)));
-    
-    ASSERT_EQ(StringVal("C"),
-              MathFunctions::hex_int(context, BigIntVal(12)));
-    
-    ASSERT_EQ(StringVal("90"),
-              MathFunctions::hex_int(context, BigIntVal(144)));
-    
-    ASSERT_EQ(StringVal("FFFFFFFFFFFFFFFF"),
-              MathFunctions::hex_int(context, BigIntVal(-1)));
-    
-    ASSERT_EQ(StringVal("FFFFFFFFFFFFFFFE"),
-              MathFunctions::hex_int(context, BigIntVal(-2)));
-    
-    ASSERT_EQ(StringVal("24EC1"),
-              MathFunctions::hex_int(context, BigIntVal(151233)));
-    
+
+    ASSERT_EQ(StringVal("0"), MathFunctions::hex_int(context, BigIntVal(0)));
+
+    ASSERT_EQ(StringVal("C"), MathFunctions::hex_int(context, BigIntVal(12)));
+
+    ASSERT_EQ(StringVal("90"), MathFunctions::hex_int(context, BigIntVal(144)));
+
+    ASSERT_EQ(StringVal("FFFFFFFFFFFFFFFF"), MathFunctions::hex_int(context, BigIntVal(-1)));
+
+    ASSERT_EQ(StringVal("FFFFFFFFFFFFFFFE"), MathFunctions::hex_int(context, BigIntVal(-2)));
+
+    ASSERT_EQ(StringVal("24EC1"), MathFunctions::hex_int(context, BigIntVal(151233)));
+
     delete context;
 }
 
 TEST_F(MathFunctionsTest, hex_string) {
     doris_udf::FunctionContext* context = new doris_udf::FunctionContext();
-    
-    ASSERT_EQ(StringVal::null(),
-              MathFunctions::hex_string(context, StringVal::null()));
-    
-    ASSERT_EQ(StringVal("30"),
-     MathFunctions::hex_string(context, StringVal("0")));
 
-    ASSERT_EQ(StringVal("31"),
-     MathFunctions::hex_string(context, StringVal("1")));
+    ASSERT_EQ(StringVal::null(), MathFunctions::hex_string(context, StringVal::null()));
+
+    ASSERT_EQ(StringVal("30"), MathFunctions::hex_string(context, StringVal("0")));
+
+    ASSERT_EQ(StringVal("31"), MathFunctions::hex_string(context, StringVal("1")));
 
-    ASSERT_EQ(StringVal("313233"),
-     MathFunctions::hex_string(context, StringVal("123")));
+    ASSERT_EQ(StringVal("313233"), MathFunctions::hex_string(context, StringVal("123")));
 
-    ASSERT_EQ(StringVal("41"),
-     MathFunctions::hex_string(context, StringVal("A")));
+    ASSERT_EQ(StringVal("41"), MathFunctions::hex_string(context, StringVal("A")));
 
-    ASSERT_EQ(StringVal("61"),
-     MathFunctions::hex_string(context, StringVal("a")));
+    ASSERT_EQ(StringVal("61"), MathFunctions::hex_string(context, StringVal("a")));
 
-    ASSERT_EQ(StringVal("E68891"),
-     MathFunctions::hex_string(context, StringVal("我")));
+    ASSERT_EQ(StringVal("E68891"), MathFunctions::hex_string(context, StringVal("我")));
+
+    ASSERT_EQ(StringVal("3F"), MathFunctions::hex_string(context, StringVal("?")));
 
-    ASSERT_EQ(StringVal("3F"),
-              MathFunctions::hex_string(context, StringVal("?")));
-    
     delete context;
 }
 
 TEST_F(MathFunctionsTest, unhex) {
     doris_udf::FunctionContext* context = new doris_udf::FunctionContext();
-    
-    ASSERT_EQ(StringVal::null(),
-     MathFunctions::unhex(context, StringVal::null()));
-    
-    ASSERT_EQ(StringVal("123"),
-              MathFunctions::unhex(context, StringVal("313233")));
-
-    ASSERT_EQ(StringVal(""),
-              MathFunctions::unhex(context, StringVal("@!#")));
-    
-    ASSERT_EQ(StringVal(""),
-              MathFunctions::unhex(context, StringVal("@@")));
-    
-    ASSERT_EQ(StringVal("a"),
-              MathFunctions::unhex(context, StringVal("61")));
-    
-    ASSERT_EQ(StringVal("123"),
-              MathFunctions::unhex(context, StringVal("313233")));
-    
-    ASSERT_EQ(StringVal(""),
-              MathFunctions::unhex(context, StringVal("我")));
-    
-    ASSERT_EQ(StringVal("?"),
-              MathFunctions::unhex(context, StringVal("EFBC9F")));
-    
+
+    ASSERT_EQ(StringVal::null(), MathFunctions::unhex(context, StringVal::null()));
+
+    ASSERT_EQ(StringVal("123"), MathFunctions::unhex(context, StringVal("313233")));
+
+    ASSERT_EQ(StringVal(""), MathFunctions::unhex(context, StringVal("@!#")));
+
+    ASSERT_EQ(StringVal(""), MathFunctions::unhex(context, StringVal("@@")));
+
+    ASSERT_EQ(StringVal("a"), MathFunctions::unhex(context, StringVal("61")));
+
+    ASSERT_EQ(StringVal("123"), MathFunctions::unhex(context, StringVal("313233")));
+
+    ASSERT_EQ(StringVal(""), MathFunctions::unhex(context, StringVal("我")));
+
+    ASSERT_EQ(StringVal("?"), MathFunctions::unhex(context, StringVal("EFBC9F")));
     delete context;
 }
 
-
 TEST_F(MathFunctionsTest, round_up_to) {
-
     DoubleVal r0(0);
     DoubleVal r1(1);
     DoubleVal r2(3);
@@ -291,7 +268,7 @@ TEST_F(MathFunctionsTest, round_up_to) {
     ASSERT_EQ(r6, MathFunctions::round_up_to(ctx, DoubleVal(222450.00), IntVal(-2)));
 }
 
-}// namespace doris
+} // namespace doris
 
 int main(int argc, char** argv) {
     std::string conffile = std::string(getenv("DORIS_HOME")) + "/conf/be.conf";


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org