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] = {