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 b260a02215 [fix](be): fix stack overflow in unhex function (#11204) b260a02215 is described below commit b260a02215033e87c67b2ae09ba2ac9ff0a50aef Author: spaces-x <weixiao5...@gmail.com> AuthorDate: Thu Jul 28 14:59:54 2022 +0800 [fix](be): fix stack overflow in unhex function (#11204) * [fix](be): fix stack overflow in unhex function --- 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 | 5 ++++- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/be/src/exprs/math_functions.cpp b/be/src/exprs/math_functions.cpp index cfda429db1..f21ebb2c62 100644 --- a/be/src/exprs/math_functions.cpp +++ b/be/src/exprs/math_functions.cpp @@ -381,7 +381,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) { @@ -426,7 +427,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 d73fc6d691..7f72be40df 100644 --- a/be/src/udf/udf.cpp +++ b/be/src/udf/udf.cpp @@ -209,11 +209,11 @@ FunctionContext* FunctionContextImpl::clone(MemPool* pool) { 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 959deac8c4..c4e5583bfc 100644 --- a/be/src/udf/udf.h +++ b/be/src/udf/udf.h @@ -37,6 +37,7 @@ class BitmapValue; class DecimalV2Value; class DateTimeValue; class CollectionValue; +class MemPool; } // namespace doris namespace doris_udf { @@ -255,7 +256,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 3cfdc4225a..e9231cbbe3 100644 --- a/be/test/exprs/math_functions_test.cpp +++ b/be/test/exprs/math_functions_test.cpp @@ -23,6 +23,7 @@ #include <string> #include "runtime/large_int_value.h" +#include "runtime/mem_pool.h" #include "testutil/function_utils.h" #include "udf/udf_internal.h" @@ -217,7 +218,9 @@ TEST_F(MathFunctionsTest, hex_string) { } TEST_F(MathFunctionsTest, unhex) { - doris_udf::FunctionContext* context = new doris_udf::FunctionContext(); + MemPool mem_pool; + doris_udf::FunctionContext* context = + doris_udf::FunctionContext::create_test_context(&mem_pool); EXPECT_EQ(StringVal::null(), MathFunctions::unhex(context, StringVal::null())); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org