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.
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 */
}
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();
*/
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;
}
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 {std::string_view{input}, std::string_view{}};
+ return {sv, std::string_view{}};