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