From e93eda7ed9b291a1d968d74e2cc0d4016ea7e682 Mon Sep 17 00:00:00 2001 From: Alex Rousskov Date: Mon, 30 Jun 2025 20:32:16 +0000 Subject: [PATCH] Simplify appending SBuf to String (#2108) There is still a lot of code that uses legacy String class, and an increasing amount of code that has to append modern SBufs to Strings. SBuf handles NUL bytes better than String. With respect to handling NUL bytes, the new append() method is as (un)safe as the existing explicit size-based one (that callers tend to use prior to these changes anyway). --- src/SquidString.h | 2 ++ src/String.cc | 7 +++++++ src/clients/FtpGateway.cc | 8 ++++---- src/ipc/Port.cc | 4 ++-- src/ipc/mem/Segment.cc | 2 +- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/SquidString.h b/src/SquidString.h index 1851eaae49..ab8125b10b 100644 --- a/src/SquidString.h +++ b/src/SquidString.h @@ -13,6 +13,7 @@ #include "base/TextException.h" #include "debug/Stream.h" +#include "sbuf/forward.h" #include @@ -98,6 +99,7 @@ public: void append(char const *buf); void append(char const); void append(String const &); + void append(const SBuf &); ///< adds the entire given buffer void absorb(String &old); const char * pos(char const *aString) const; const char * pos(char const ch) const; diff --git a/src/String.cc b/src/String.cc index 79fe1a2e10..45e24c9482 100644 --- a/src/String.cc +++ b/src/String.cc @@ -8,6 +8,7 @@ #include "squid.h" #include "mem/forward.h" +#include "sbuf/SBuf.h" #include "SquidString.h" #include @@ -175,6 +176,12 @@ String::append(String const &old) append(old.rawBuf(), old.len_); } +void +String::append(const SBuf &buf) +{ + append(buf.rawContent(), buf.length()); +} + void String::absorb(String &old) { diff --git a/src/clients/FtpGateway.cc b/src/clients/FtpGateway.cc index fc0f3a2e94..ddf9616029 100644 --- a/src/clients/FtpGateway.cc +++ b/src/clients/FtpGateway.cc @@ -1122,8 +1122,8 @@ Ftp::Gateway::buildTitleUrl() SBuf authority = request->url.authority(request->url.getScheme() != AnyP::PROTO_FTP); - title_url.append(authority.rawContent(), authority.length()); - title_url.append(request->url.path().rawContent(), request->url.path().length()); + title_url.append(authority); + title_url.append(request->url.path()); base_href = "ftp://"; @@ -1138,8 +1138,8 @@ Ftp::Gateway::buildTitleUrl() base_href.append("@"); } - base_href.append(authority.rawContent(), authority.length()); - base_href.append(request->url.path().rawContent(), request->url.path().length()); + base_href.append(authority); + base_href.append(request->url.path()); base_href.append("/"); } diff --git a/src/ipc/Port.cc b/src/ipc/Port.cc index 2446d1bb7a..566327f2d4 100644 --- a/src/ipc/Port.cc +++ b/src/ipc/Port.cc @@ -53,7 +53,7 @@ String Ipc::Port::MakeAddr(const char* processLabel, int id) { assert(id >= 0); String addr = channelPathPfx; - addr.append(service_name.c_str()); + addr.append(service_name); addr.append(processLabel); addr.append('-'); addr.append(xitoa(id)); @@ -67,7 +67,7 @@ Ipc::Port::CoordinatorAddr() static String coordinatorAddr; if (!coordinatorAddr.size()) { coordinatorAddr= channelPathPfx; - coordinatorAddr.append(service_name.c_str()); + coordinatorAddr.append(service_name); coordinatorAddr.append(coordinatorAddrLabel); coordinatorAddr.append(".ipc"); } diff --git a/src/ipc/mem/Segment.cc b/src/ipc/mem/Segment.cc index 67ba4431f1..dbd458b57a 100644 --- a/src/ipc/mem/Segment.cc +++ b/src/ipc/mem/Segment.cc @@ -278,7 +278,7 @@ Ipc::Mem::Segment::GenerateName(const char *id) name.append('/'); } else { name.append('/'); - name.append(service_name.c_str()); + name.append(service_name); name.append('-'); } -- 2.39.5