]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Use string_view::data() instead of begin() for pointer access master
authorVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 11 Apr 2026 06:55:16 +0000 (07:55 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 11 Apr 2026 06:55:16 +0000 (07:55 +0100)
Fixes #5969 - libc++ may return __wrap_iter from string_view::begin()
instead of a raw const char *, breaking builds with libc++ 22 on FreeBSD.

Use .data() where a const char * is needed and rewrite string_split_on
to use find/substr instead of iterators.

src/client/rspamc.cxx
src/libserver/css/css_util.cxx
src/libserver/html/html_url.cxx
src/libutil/cxx/util.hxx

index 9ddb1806f848db02b046a212d3374ceb20ed80a4..b7cffdf4ae1b7856aca26a2513eb012206977254 100644 (file)
@@ -649,7 +649,7 @@ rspamc_password_callback(const char *option_name,
                                value_view = std::string_view{map, locked_mmap->get_size()};
                                auto right = value_view.end() - 1;
                                for (; right > value_view.cbegin() && g_ascii_isspace(*right); --right);
                                value_view = std::string_view{map, locked_mmap->get_size()};
                                auto right = value_view.end() - 1;
                                for (; right > value_view.cbegin() && g_ascii_isspace(*right); --right);
-                               std::string_view str{value_view.begin(), static_cast<size_t>(right - value_view.begin()) + 1};
+                               std::string_view str{value_view.data(), static_cast<size_t>(right - value_view.begin()) + 1};
                                processed_passwd.assign(std::begin(str), std::end(str));
                                processed_passwd.push_back('\0'); /* Null-terminate for C part */
                        }
                                processed_passwd.assign(std::begin(str), std::end(str));
                                processed_passwd.push_back('\0'); /* Null-terminate for C part */
                        }
index 5a34250a0c2c1b6dfdff1ff773a3f7f1796aea4a..e23d36bdc6ef145e1417a6462183f29e80e9387c 100644 (file)
@@ -147,7 +147,7 @@ const char *rspamd_css_unescape(rspamd_mempool_t *pool,
                                                                gsize *outlen)
 {
        auto sv = rspamd::css::unescape_css(pool, {(const char *) begin, len});
                                                                gsize *outlen)
 {
        auto sv = rspamd::css::unescape_css(pool, {(const char *) begin, len});
-       const auto *v = sv.begin();
+       const auto *v = sv.data();
 
        if (outlen) {
                *outlen = sv.size();
 
        if (outlen) {
                *outlen = sv.size();
index 7598a01326dd5404ec11c0ff0146a90f70395e9a..2c800688019c26df5c4d86c04d0f0e7d5caa1498 100644 (file)
@@ -205,8 +205,8 @@ auto html_url_is_phished(rspamd_mempool_t *pool,
                         */
                        gboolean obfuscation_found = FALSE;
 
                         */
                        gboolean obfuscation_found = FALSE;
 
-                       if (text_data.size() > 4 && g_ascii_strncasecmp(text_data.begin(), "http", 4) == 0 &&
-                               rspamd_substring_search(text_data.begin(), text_data.size(), "://", 3) != -1) {
+                       if (text_data.size() > 4 && g_ascii_strncasecmp(text_data.data(), "http", 4) == 0 &&
+                               rspamd_substring_search(text_data.data(), text_data.size(), "://", 3) != -1) {
                                /* Clearly an obfuscation attempt */
                                obfuscation_found = TRUE;
                        }
                                /* Clearly an obfuscation attempt */
                                obfuscation_found = TRUE;
                        }
index 32ec0b55c399f3ebf4a536a9a619e69031930fdd..930164d5adaa26cc49a29d5ee4d3c9ec195e82c5 100644 (file)
@@ -144,19 +144,18 @@ inline auto string_foreach_delim(const S &input, const D &delim, const F &functo
 template<class S, typename std::enable_if_t<std::is_constructible_v<std::string_view, S>, bool> = true>
 inline auto string_split_on(const S &input, std::string_view::value_type chr) -> std::pair<std::string_view, std::string_view>
 {
 template<class S, typename std::enable_if_t<std::is_constructible_v<std::string_view, S>, bool> = true>
 inline auto string_split_on(const S &input, std::string_view::value_type chr) -> std::pair<std::string_view, std::string_view>
 {
-       auto pos = std::find(std::begin(input), std::end(input), chr);
+       std::string_view sv{input};
+       auto pos = sv.find(chr);
 
 
-       if (pos != input.end()) {
-               auto first = std::string_view{std::begin(input), static_cast<std::size_t>(std::distance(std::begin(input), pos))};
-               while (*pos == chr && pos != input.end()) {
-                       ++pos;
-               }
-               auto last = std::string_view{pos, static_cast<std::size_t>(std::distance(pos, std::end(input)))};
+       if (pos != std::string_view::npos) {
+               auto first = sv.substr(0, pos);
+               auto rest = sv.find_first_not_of(chr, pos);
+               auto last = rest != std::string_view::npos ? sv.substr(rest) : std::string_view{};
 
                return {first, last};
        }
 
 
                return {first, last};
        }
 
-       return {std::string_view{input}, std::string_view{}};
+       return {sv, std::string_view{}};
 }
 
 /**
 }
 
 /**