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

moonchen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 110b5442a7 copy only len_in bytes in the escapify no-escape path 
(#13404)
110b5442a7 is described below

commit 110b5442a77b3f04bb9b694fb01abeea821c6438
Author: Javid Khan <[email protected]>
AuthorDate: Mon Jul 20 22:02:18 2026 +0530

    copy only len_in bytes in the escapify no-escape path (#13404)
---
 src/tscore/Encoding.cc                 |  5 +++--
 src/tscore/unit_tests/test_Encoding.cc | 25 +++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/src/tscore/Encoding.cc b/src/tscore/Encoding.cc
index 4bae0a9aa0..e7257e1253 100644
--- a/src/tscore/Encoding.cc
+++ b/src/tscore/Encoding.cc
@@ -77,7 +77,7 @@ escapify_url_common(Arena *arena, char *url, size_t len_in, 
int *len_out, char *
 
   static char hex_digit[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', 
'9', 'A', 'B', 'C', 'D', 'E', 'F'};
 
-  if (!url || (dst && dst_size < len_in)) {
+  if (!url || (dst && dst_size <= len_in)) {
     *len_out = 0;
     return nullptr;
   }
@@ -105,7 +105,8 @@ escapify_url_common(Arena *arena, char *url, size_t len_in, 
int *len_out, char *
     //
     *len_out = len_in;
     if (dst) {
-      ink_strlcpy(dst, url, dst_size);
+      memcpy(dst, url, len_in);
+      dst[len_in] = '\0';
     }
     return url;
   }
diff --git a/src/tscore/unit_tests/test_Encoding.cc 
b/src/tscore/unit_tests/test_Encoding.cc
index b949964021..dc670afcc6 100644
--- a/src/tscore/unit_tests/test_Encoding.cc
+++ b/src/tscore/unit_tests/test_Encoding.cc
@@ -22,6 +22,7 @@
  */
 
 #include <string_view>
+#include <vector>
 #include <cstring>
 #include <cstdlib>
 #include <iostream>
@@ -57,6 +58,30 @@ TEST_CASE("Encoding pure escapify url", "[pure_esc_url]")
   }
 }
 
+TEST_CASE("Encoding escapify url without a terminator", 
"[esc_url_unterminated]")
+{
+  // The source is a counted string, not a C string, so nothing may be read 
past len_in.
+  // Sized exactly so that a read past the end is caught by a sanitizer.
+  constexpr std::string_view src{"abcdef"};
+
+  std::vector<char> unterminated(src.begin(), src.end());
+
+  char output[128];
+  int  output_len;
+
+  REQUIRE(Encoding::pure_escapify_url(nullptr, unterminated.data(), 
unterminated.size(), &output_len, output, sizeof(output)) !=
+          nullptr);
+  CHECK(output_len == static_cast<int>(src.size()));
+  CHECK(std::string_view(output, output_len) == src);
+  CHECK(output[output_len] == '\0');
+
+  REQUIRE(Encoding::escapify_url(nullptr, unterminated.data(), 
unterminated.size(), &output_len, output, sizeof(output)) !=
+          nullptr);
+  CHECK(output_len == static_cast<int>(src.size()));
+  CHECK(std::string_view(output, output_len) == src);
+  CHECK(output[output_len] == '\0');
+}
+
 TEST_CASE("Encoding escapify url", "[esc_url]")
 {
   char input[][32] = {

Reply via email to