aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/PlaylistFile.cxx12
-rw-r--r--src/util/StringUtil.cxx15
-rw-r--r--src/util/StringUtil.hxx8
3 files changed, 27 insertions, 8 deletions
diff --git a/src/PlaylistFile.cxx b/src/PlaylistFile.cxx
index f9c3ab3f3..43dcca294 100644
--- a/src/PlaylistFile.cxx
+++ b/src/PlaylistFile.cxx
@@ -173,12 +173,9 @@ LoadPlaylistFileInfo(PlaylistInfo &info,
return false;
const auto *const name_fs_str = name_fs.c_str();
- const size_t name_length = name_fs.length();
-
- if (name_length < ARRAY_SIZE(PLAYLIST_FILE_SUFFIX))
- return false;
-
- if (!StringEndsWith(name_fs_str, PLAYLIST_FILE_SUFFIX))
+ const auto *const name_fs_end =
+ FindStringSuffix(name_fs_str, PLAYLIST_FILE_SUFFIX);
+ if (name_fs_end == nullptr)
return false;
FileInfo fi;
@@ -186,8 +183,7 @@ LoadPlaylistFileInfo(PlaylistInfo &info,
!fi.IsRegular())
return false;
- PathTraitsFS::string name(name_fs_str,
- name_length + 1 - ARRAY_SIZE(PLAYLIST_FILE_SUFFIX));
+ PathTraitsFS::string name(name_fs_str, name_fs_end);
std::string name_utf8 = PathToUTF8(name.c_str());
if (name_utf8.empty())
return false;
diff --git a/src/util/StringUtil.cxx b/src/util/StringUtil.cxx
index 4d538989f..107354b6e 100644
--- a/src/util/StringUtil.cxx
+++ b/src/util/StringUtil.cxx
@@ -96,6 +96,21 @@ StringEndsWith(const char *haystack, const char *needle)
needle, needle_length) == 0;
}
+const char *
+FindStringSuffix(const char *p, const char *suffix)
+{
+ const size_t p_length = strlen(p);
+ const size_t suffix_length = strlen(suffix);
+
+ if (p_length < suffix_length)
+ return nullptr;
+
+ const char *q = p + p_length - suffix_length;
+ return memcmp(q, suffix, suffix_length) == 0
+ ? q
+ : nullptr;
+}
+
char *
CopyString(char *gcc_restrict dest, const char *gcc_restrict src, size_t size)
{
diff --git a/src/util/StringUtil.hxx b/src/util/StringUtil.hxx
index 9f2dab935..4f44ab94a 100644
--- a/src/util/StringUtil.hxx
+++ b/src/util/StringUtil.hxx
@@ -91,6 +91,14 @@ bool
StringEndsWith(const char *haystack, const char *needle);
/**
+ * Check if the given string ends with the specified suffix. If yes,
+ * returns the position of the suffix, and nullptr otherwise.
+ */
+gcc_pure
+const char *
+FindStringSuffix(const char *p, const char *suffix);
+
+/**
* Copy a string. If the buffer is too small, then the string is
* truncated. This is a safer version of strncpy().
*