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

zhangstar333 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 78b0c60c6d9 [Bug](function) fix to_ipv6 cause stack-buffer-overflow 
error (#53713)
78b0c60c6d9 is described below

commit 78b0c60c6d98220b64efb2dfee9bcb3ed9ea9d86
Author: zhangstar333 <[email protected]>
AuthorDate: Fri Jul 25 15:16:52 2025 +0800

    [Bug](function) fix to_ipv6 cause stack-buffer-overflow error (#53713)
    
    ### What problem does this PR solve?
    Problem Summary:
    
    memcpy(dst, &result, sizeof(result));
    when use memcpy, it's size if sizeof(result), so use int64 maybe
    overflow of dst
    
    ```
    ==3524968==ERROR: AddressSanitizer: stack-buffer-overflow on address 
0x7f18404e1d73 at pc 0x559e2c162b01 bp 0x7f18439e5dc0 sp 0x7f18439e5db8
    WRITE of size 8 at 0x7f18404e1d73 thread T1265 (brpc_light)
        #0 0x559e2c162b00 in bool doris::vectorized::parse_ipv4<char const, 
doris::vectorized::parse_ipv6(char const*, char const*, unsigned 
char*)::'lambda'()>(char const*&, doris::vectorized::parse_ipv6(char const*, 
char const*, unsigned char*)::'lambda'(), unsigned char*, long) 
/mnt/disk8/zhangsida/doris/be/src/vec/common/format_ip.h:165:5
        #1 0x559e2c161eb3 in bool doris::vectorized::parse_ipv6<char const, 
doris::vectorized::parse_ipv6(char const*, char const*, unsigned 
char*)::'lambda'()>(char const*&, doris::vectorized::parse_ipv6(char const*, 
char const*, unsigned char*)::'lambda'(), unsigned char*, int) 
/mnt/disk8/zhangsida/doris/be/src/vec/common/format_ip.h:416:18
        #2 0x559e2c160c44 in doris::vectorized::parse_ipv6(char const*, char 
const*, unsigned char*) 
/mnt/disk8/zhangsida/doris/be/src/vec/common/format_ip.h:467:9
        #3 0x559e2c160c44 in doris::vectorized::parse_ipv6_whole(char const*, 
char const*, unsigned char*) 
/mnt/disk8/zhangsida/doris/be/src/vec/common/format_ip.h:475:12
        #4 0x559e2c160c44 in doris::IPv6Value::from_string(unsigned __int128&, 
char const*, unsigned long) 
/mnt/disk8/zhangsida/doris/be/src/vec/runtime/ipv6_value.h:71:16
        #5 0x559e4fdb05f3 in 
doris::vectorized::FunctionToIP<(doris::vectorized::IPConvertExceptionMode)0, 
(doris::PrimitiveType)37>::execute_impl(doris::FunctionContext*, 
doris::vectorized::Block&, std::vector<unsigned int, std::allocator<unsigned 
int>> const&, unsigned int, unsigned long) const 
/mnt/disk8/zhangsida/doris/be/src/vec/functions/function_ip.h:1180:21
        #6 0x559e4c233b1e in 
doris::vectorized::DefaultExecutable::execute_impl(doris::FunctionContext*, 
doris::vectorized::Block&, std::vector<unsigned int, std::allocator<unsigned 
int>> const&, unsigned int, unsigned long) const 
/mnt/disk8/zhangsida/doris/be/src/vec/functions/function.h:447:26
        #7 0x559e4eebcef3 in 
doris::vectorized::PreparedFunctionImpl::_execute_skipped_constant_deal(doris::FunctionContext*,
 doris::vectorized::Block&, std::vector<unsigned int, std::allocator<unsigned 
int>> const&, unsigned int, unsigned long, bool) const 
/mnt/disk8/zhangsida/doris/be/src/vec/functions/function.cpp
        #8 0x559e4eeb68c4 in 
doris::vectorized::PreparedFunctionImpl::default_implementation_for_constant_arguments(doris::FunctionContext*,
 doris::vectorized::Block&, std::vector<unsigned int, std::allocator<unsigned 
int>> const&, unsigned int, unsigned long, bool, bool*) const 
/mnt/disk8/zhangsida/doris/be/src/vec/functions/function.cpp:168:5
        #9 0x559e4eeb8fc4 in 
doris::vectorized::PreparedFunctionImpl::execute_without_low_cardinality_columns(doris::FunctionContext*,
 doris::vectorized::Block&, std::vector<unsigned int, std::allocator<unsigned 
int>> const&, unsigned int, unsigned long, bool) const 
/mnt/disk8/zhangsida/doris/be/src/vec/functions/function.cpp:237:5
    ```
---
 be/src/vec/common/format_ip.h          |  6 +++---
 be/src/vec/functions/function_ip.h     |  4 +---
 be/test/vec/columns/column_ip_test.cpp | 23 ++++++++++++++++++++++-
 3 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/be/src/vec/common/format_ip.h b/be/src/vec/common/format_ip.h
index c06de536632..365b182161a 100644
--- a/be/src/vec/common/format_ip.h
+++ b/be/src/vec/common/format_ip.h
@@ -125,12 +125,12 @@ inline void format_ipv4(const unsigned char* src, char*& 
dst, uint8_t mask_tail_
  */
 template <typename T, typename EOFfunction>
     requires(std::is_same<typename std::remove_cv<T>::type, char>::value)
-inline bool parse_ipv4(T*& src, EOFfunction eof, unsigned char* dst, int64_t 
first_octet = -1) {
+inline bool parse_ipv4(T*& src, EOFfunction eof, unsigned char* dst, int32_t 
first_octet = -1) {
     if (src == nullptr || first_octet > IPV4_MAX_OCTET_VALUE) {
         return false;
     }
 
-    int64_t result = 0;
+    UInt32 result = 0;
     int offset = (IPV4_BINARY_LENGTH - 1) * IPV4_OCTET_BITS;
     if (first_octet >= 0) {
         result |= first_octet << offset;
@@ -142,7 +142,7 @@ inline bool parse_ipv4(T*& src, EOFfunction eof, unsigned 
char* dst, int64_t fir
             return false;
         }
 
-        int64_t value = 0;
+        UInt32 value = 0;
         size_t len = 0;
         while (is_numeric_ascii(*src) && len <= 3) {
             value = value * DECIMAL_BASE + (*src - '0');
diff --git a/be/src/vec/functions/function_ip.h 
b/be/src/vec/functions/function_ip.h
index ffa8deb447c..651a0f9ea7a 100644
--- a/be/src/vec/functions/function_ip.h
+++ b/be/src/vec/functions/function_ip.h
@@ -151,10 +151,8 @@ ColumnPtr convert_to_ipv4(ColumnPtr column, const 
PaddedPODArray<UInt8>* null_ma
         vec_null_map_to = &col_null_map_to->get_data();
     }
 
-    auto col_res = ToColumn::create();
-
+    auto col_res = ToColumn::create(column_size, 0);
     auto& vec_res = col_res->get_data();
-    vec_res.resize(column_size);
 
     const ColumnString::Chars& vec_src = column_string->get_chars();
     const ColumnString::Offsets& offsets_src = column_string->get_offsets();
diff --git a/be/test/vec/columns/column_ip_test.cpp 
b/be/test/vec/columns/column_ip_test.cpp
index 928afb1e799..40579677314 100644
--- a/be/test/vec/columns/column_ip_test.cpp
+++ b/be/test/vec/columns/column_ip_test.cpp
@@ -20,12 +20,12 @@
 #include <gtest/gtest.h>
 
 #include "vec/columns/column.h"
-#include "vec/columns/column_array.h"
 #include "vec/columns/common_column_test.h"
 #include "vec/core/types.h"
 #include "vec/data_types/data_type.h"
 #include "vec/data_types/data_type_factory.hpp"
 #include "vec/data_types/data_type_nullable.h"
+#include "vec/functions/function_ip.h"
 
 // this test is gonna to make a template ColumnTest
 // for example column_ip should test these functions
@@ -312,4 +312,25 @@ TEST_F(ColumnIPTest, HashTest) {
     assert_update_crc_hashes_callback(ip_cols, serde, pts);
 };
 
+TEST_F(ColumnIPTest, IPv6ValueFromStringTest) {
+    std::string ipv6_str = "1111:2222:3333:4444:5555:6666:123.123.123.123";
+    IPv6 ipv6_val = 0;
+    ASSERT_EQ(IPv6Value::from_string(ipv6_val, ipv6_str.data(), 
ipv6_str.size()), true);
+    ASSERT_EQ("1111:2222:3333:4444:5555:6666:7b7b:7b7b", 
IPv6Value(ipv6_val).to_string());
+};
+
+TEST_F(ColumnIPTest, IPv4ValueFromStringTest) {
+    std::string ipv4_str = "127.0.0.1";
+    IPv4 ipv4_val = 0;
+    ASSERT_EQ(IPv4Value::from_string(ipv4_val, ipv4_str.data(), 
ipv4_str.size()), true);
+    ASSERT_EQ("127.0.0.1", IPv4Value(ipv4_val).to_string());
+};
+
+TEST_F(ColumnIPTest, IPv4Parse) {
+    std::string ipv4_str = "127.0.0.1";
+    Int64 result_value = 0;
+    ASSERT_EQ(try_parse_ipv4(ipv4_str.data(), result_value), true);
+    ASSERT_EQ(2130706433, result_value);
+};
+
 } // namespace doris::vectorized
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to