diff --git a/src/command/FingerprintCommands.cxx b/src/command/FingerprintCommands.cxx index 3e8fa5893..6bcd5005e 100644 --- a/src/command/FingerprintCommands.cxx +++ b/src/command/FingerprintCommands.cxx @@ -164,7 +164,7 @@ GetChromaprintCommand::DecodeStream(InputStream &is, inline void GetChromaprintCommand::DecodeStream(InputStream &is) { - const auto suffix = uri_get_suffix(uri.c_str()); + const auto suffix = uri_get_suffix(uri); decoder_plugins_try([this, &is, suffix](const DecoderPlugin &plugin){ return DecodeStream(is, suffix, plugin); @@ -222,7 +222,7 @@ GetChromaprintCommand::DecodeFile(std::string_view suffix, InputStream &is, inline void GetChromaprintCommand::DecodeFile() { - const auto suffix = uri_get_suffix(uri.c_str()); + const auto suffix = uri_get_suffix(uri); if (suffix.empty()) return; diff --git a/src/util/UriExtract.cxx b/src/util/UriExtract.cxx index 31215e1c9..fd09e699d 100644 --- a/src/util/UriExtract.cxx +++ b/src/util/UriExtract.cxx @@ -122,20 +122,21 @@ uri_get_path(std::string_view uri) noexcept /* suffixes should be ascii only characters */ std::string_view -uri_get_suffix(const char *uri) noexcept +uri_get_suffix(std::string_view _uri) noexcept { - const char *suffix = std::strrchr(uri, '.'); - if (suffix == nullptr || suffix == uri || - suffix[-1] == '/' || suffix[-1] == '\\') + StringView uri(_uri); + const char *dot = uri.FindLast('.'); + if (dot == nullptr || dot == uri.data || + dot[-1] == '/' || dot[-1] == '\\') return {}; - ++suffix; - - if (strpbrk(suffix, "/\\") != nullptr) + auto suffix = uri.substr(dot + 1); + if (suffix.Find('/') != nullptr || suffix.Find('\\') != nullptr) + /* this was not the last path segment */ return {}; /* remove the query string */ - return StringView(suffix).Split('?').first; + return suffix.Split('?').first; } const char * diff --git a/src/util/UriExtract.hxx b/src/util/UriExtract.hxx index 12d1a9df4..4bdbe784d 100644 --- a/src/util/UriExtract.hxx +++ b/src/util/UriExtract.hxx @@ -63,7 +63,7 @@ uri_get_path(std::string_view uri) noexcept; gcc_pure std::string_view -uri_get_suffix(const char *uri) noexcept; +uri_get_suffix(std::string_view uri) noexcept; /** * Returns the URI fragment, i.e. the portion after the '#', but diff --git a/test/ContainerScan.cxx b/test/ContainerScan.cxx index 84300a775..ef4ab24cd 100644 --- a/test/ContainerScan.cxx +++ b/test/ContainerScan.cxx @@ -48,7 +48,8 @@ FindContainerDecoderPlugin(std::string_view suffix) static const DecoderPlugin * FindContainerDecoderPlugin(Path path) { - const auto suffix = uri_get_suffix(path.ToUTF8Throw().c_str()); + const auto path_utf8 = path.ToUTF8Throw(); + const auto suffix = uri_get_suffix(path_utf8); if (suffix.empty()) return nullptr;