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

HappenLee 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 3d7b76454c6 [fix](be) Remove unsafe JsonbWriter key overload (#63355)
3d7b76454c6 is described below

commit 3d7b76454c6326e796534ef251bb8b819d341c3b
Author: Jerry Hu <[email protected]>
AuthorDate: Wed May 20 15:48:48 2026 +0800

    [fix](be) Remove unsafe JsonbWriter key overload (#63355)
    
    Problem Summary: `JsonbWriter::writeKey(const char*)` inferred key
    length with `strlen`, which silently truncated byte strings that
    contained embedded NUL bytes. Remove this overload so callers must use
    the explicit-length API.
    
    ### Release note
    
    None
    
    ### Check List (For Author)
    
    - Test: Unit Test
    - `./run-be-ut.sh --run
    
--filter=JsonbDocumentTest.*:JsonbSerializeTest.*:JsonbParserTest.*:ConvertFieldToTypeTest.*`
        - `build-support/clang-format.sh`
        - `build-support/check-format.sh`
    - `build-support/run-clang-tidy.sh --build-dir be/ut_build_ASAN`
    (failed: existing clang-tidy environment/pre-existing diagnostics report
    missing `stddef.h` and unmatched `NOLINTEND` in `be/src/core/types.h`)
    - Behavior changed: Yes. Internal C++ callers can no longer use
    `JsonbWriter::writeKey(const char*)` and must pass an explicit key
    length.
    - Does this need documentation: No
---
 be/src/util/jsonb_writer.h                        |  2 --
 be/test/core/jsonb/convert_field_to_type_test.cpp |  4 +--
 be/test/core/jsonb/jsonb_document_test.cpp        | 37 ++++++++++++-----------
 be/test/util/jsonb_serialize_test.cpp             |  8 ++---
 4 files changed, 25 insertions(+), 26 deletions(-)

diff --git a/be/src/util/jsonb_writer.h b/be/src/util/jsonb_writer.h
index 94765a5ef6e..ba168a9e343 100644
--- a/be/src/util/jsonb_writer.h
+++ b/be/src/util/jsonb_writer.h
@@ -100,8 +100,6 @@ public:
         }
     }
 
-    bool writeKey(const char* key) { return writeKey(key, strlen(key)); }
-
     // write a key string (or key id if an external dict is provided)
     bool writeKey(const char* key, uint8_t len) {
         if (!stack_.empty() && verifyKeyState()) {
diff --git a/be/test/core/jsonb/convert_field_to_type_test.cpp 
b/be/test/core/jsonb/convert_field_to_type_test.cpp
index 921cb9693e5..8c96894d3d1 100644
--- a/be/test/core/jsonb/convert_field_to_type_test.cpp
+++ b/be/test/core/jsonb/convert_field_to_type_test.cpp
@@ -390,7 +390,7 @@ TEST_F(ConvertFieldToTypeTest, ConvertFieldToType_ToJsonb) {
     {
         JsonbWriter test_writer;
         test_writer.writeStartObject();
-        test_writer.writeKey("key");
+        test_writer.writeKey("key", static_cast<uint8_t>(sizeof("key") - 1));
         test_writer.writeString("value");
         test_writer.writeEndObject();
 
@@ -513,4 +513,4 @@ TEST_F(ConvertFieldToTypeTest, 
ConvertFieldToType_ErrorCases) {
     }
 }
 
-} // namespace doris
\ No newline at end of file
+} // namespace doris
diff --git a/be/test/core/jsonb/jsonb_document_test.cpp 
b/be/test/core/jsonb/jsonb_document_test.cpp
index bffc21f46b9..c189afb025a 100644
--- a/be/test/core/jsonb/jsonb_document_test.cpp
+++ b/be/test/core/jsonb/jsonb_document_test.cpp
@@ -29,6 +29,7 @@
 #include "util/jsonb_writer.h"
 
 namespace doris {
+
 class JsonbDocumentTest : public testing::Test {
 protected:
     void SetUp() override {}
@@ -40,27 +41,27 @@ TEST_F(JsonbDocumentTest, writer) {
     JsonbWriter writer;
     writer.writeStartObject();
 
-    writer.writeKey("key_null");
+    writer.writeKey("key_null", static_cast<uint8_t>(sizeof("key_null") - 1));
     writer.writeNull();
 
-    writer.writeKey("key_true");
+    writer.writeKey("key_true", static_cast<uint8_t>(sizeof("key_true") - 1));
     writer.writeBool(true);
 
-    writer.writeKey("key_false");
+    writer.writeKey("key_false", static_cast<uint8_t>(sizeof("key_false") - 
1));
     writer.writeBool(false);
 
-    writer.writeKey("key_int");
+    writer.writeKey("key_int", static_cast<uint8_t>(sizeof("key_int") - 1));
     writer.writeInt(12345);
 
-    writer.writeKey("key_float");
+    writer.writeKey("key_float", static_cast<uint8_t>(sizeof("key_float") - 
1));
     writer.writeFloat(123.456);
 
-    writer.writeKey("key_string");
+    writer.writeKey("key_string", static_cast<uint8_t>(sizeof("key_string") - 
1));
     writer.writeStartString();
     writer.writeString("hello world");
     writer.writeEndString();
 
-    writer.writeKey("key_array");
+    writer.writeKey("key_array", static_cast<uint8_t>(sizeof("key_array") - 
1));
 
     writer.writeStartArray();
     writer.writeInt(1);
@@ -69,24 +70,24 @@ TEST_F(JsonbDocumentTest, writer) {
     writer.writeEndString();
     writer.writeEndArray();
 
-    writer.writeKey("key_int128");
+    writer.writeKey("key_int128", static_cast<uint8_t>(sizeof("key_int128") - 
1));
 
     __int128_t int128_value = __int128_t(std::numeric_limits<uint64_t>::max()) 
+ 1;
     writer.writeInt128(int128_value);
 
-    writer.writeKey("key_decimal32");
+    writer.writeKey("key_decimal32", 
static_cast<uint8_t>(sizeof("key_decimal32") - 1));
     Decimal32 decimal_value32(int32_t(99999999));
     writer.writeDecimal(decimal_value32, 9, 4);
 
-    writer.writeKey("key_decimal64");
+    writer.writeKey("key_decimal64", 
static_cast<uint8_t>(sizeof("key_decimal64") - 1));
     Decimal64 decimal_value64(int64_t(999999999999999999ULL));
     writer.writeDecimal(decimal_value64, 18, 4);
 
-    writer.writeKey("key_decimal128");
+    writer.writeKey("key_decimal128", 
static_cast<uint8_t>(sizeof("key_decimal128") - 1));
     Decimal128V3 
decimal_value((__int128_t(std::numeric_limits<uint64_t>::max())));
     writer.writeDecimal(decimal_value, 30, 8);
 
-    writer.writeKey("key_decimal256");
+    writer.writeKey("key_decimal256", 
static_cast<uint8_t>(sizeof("key_decimal256") - 1));
     wide::Int256 
int256_value(wide::Int256(std::numeric_limits<__int128_t>::max()) * 2);
     Decimal256 decimal256_value(int256_value);
     writer.writeDecimal(decimal256_value, 40, 8);
@@ -218,21 +219,21 @@ TEST_F(JsonbDocumentTest, forobject) {
     JsonbWriter writer;
     writer.writeStartObject();
 
-    writer.writeKey("key_null");
+    writer.writeKey("key_null", static_cast<uint8_t>(sizeof("key_null") - 1));
     writer.writeNull();
 
-    writer.writeKey("key_true");
+    writer.writeKey("key_true", static_cast<uint8_t>(sizeof("key_true") - 1));
     writer.writeBool(true);
 
-    writer.writeKey("key_false");
+    writer.writeKey("key_false", static_cast<uint8_t>(sizeof("key_false") - 
1));
     writer.writeBool(false);
 
-    writer.writeKey("key_int");
+    writer.writeKey("key_int", static_cast<uint8_t>(sizeof("key_int") - 1));
     writer.writeInt(12345);
 
     // writer array
 
-    writer.writeKey("key_array");
+    writer.writeKey("key_array", static_cast<uint8_t>(sizeof("key_array") - 
1));
     writer.writeStartArray();
     writer.writeInt(1);
     writer.writeStartString();
@@ -294,4 +295,4 @@ TEST_F(JsonbDocumentTest, invaild_jsonb_document) {
     EXPECT_EQ(json_null, json_string);
 }
 
-} // namespace doris
\ No newline at end of file
+} // namespace doris
diff --git a/be/test/util/jsonb_serialize_test.cpp 
b/be/test/util/jsonb_serialize_test.cpp
index 5b636d0f7aa..75883bc2f8a 100644
--- a/be/test/util/jsonb_serialize_test.cpp
+++ b/be/test/util/jsonb_serialize_test.cpp
@@ -136,19 +136,19 @@ TEST_F(JsonbSerializeTest, serialization2) {
 
     writer.writeKey("key_decimal32", 13);
 
-    writer.writeKey("key_decimal32");
+    writer.writeKey("key_decimal32", 
static_cast<uint8_t>(sizeof("key_decimal32") - 1));
     Decimal32 decimal_value32(int32_t(99999999));
     writer.writeDecimal(decimal_value32, 9, 4);
 
-    writer.writeKey("key_decimal64");
+    writer.writeKey("key_decimal64", 
static_cast<uint8_t>(sizeof("key_decimal64") - 1));
     Decimal64 decimal_value64(int64_t(999999999999999999ULL));
     writer.writeDecimal(decimal_value64, 18, 4);
 
-    writer.writeKey("key_decimal128");
+    writer.writeKey("key_decimal128", 
static_cast<uint8_t>(sizeof("key_decimal128") - 1));
     Decimal128V3 
decimal_value((__int128_t(std::numeric_limits<uint64_t>::max())));
     writer.writeDecimal(decimal_value, 27, 8);
 
-    writer.writeKey("key_decimal256");
+    writer.writeKey("key_decimal256", 
static_cast<uint8_t>(sizeof("key_decimal256") - 1));
     Decimal256 
decimal256_value((wide::Int256(std::numeric_limits<__int128_t>::max()) * 2));
     writer.writeDecimal(decimal256_value, 40, 8);
 


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

Reply via email to