summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/lib/util/unzip.cpp2
-rw-r--r--src/lib/util/zippath.cpp16
2 files changed, 11 insertions, 7 deletions
diff --git a/src/lib/util/unzip.cpp b/src/lib/util/unzip.cpp
index b0b64a5df3b..bf7891f0258 100644
--- a/src/lib/util/unzip.cpp
+++ b/src/lib/util/unzip.cpp
@@ -639,7 +639,7 @@ int zip_file_impl::search(std::uint32_t search_crc, const std::string &search_fi
// FIXME: if (!is_utf8) convert filename to UTF8 (assume CP437 or something)
// chop off trailing slash for directory entries
- bool const is_dir(!m_header.file_name.empty() && (*m_header.file_name.rbegin() == '/'));
+ bool const is_dir(!m_header.file_name.empty() && (m_header.file_name.back() == '/'));
if (is_dir) m_header.file_name.resize(m_header.file_name.length() - 1);
// check to see if it matches query
diff --git a/src/lib/util/zippath.cpp b/src/lib/util/zippath.cpp
index 32f2161d0b6..1e4fb6dd293 100644
--- a/src/lib/util/zippath.cpp
+++ b/src/lib/util/zippath.cpp
@@ -871,24 +871,28 @@ void zippath_closedir(zippath_directory *directory)
static const char *get_relative_path(zippath_directory const &directory)
{
auto len = directory.zipprefix.length();
- const char *prefix = directory.zipprefix.c_str();
+ char const *prefix = directory.zipprefix.c_str();
while (is_zip_file_separator(*prefix))
{
len--;
prefix++;
}
- if ((len <= directory.zipfile->current_name().length()) &&
- !strncmp(prefix, directory.zipfile->current_name().c_str(), len))
+ std::string const &current(directory.zipfile->current_name());
+ char const *result = directory.zipfile->current_name().c_str() + len;
+ if ((current.length() >= len) &&
+ !strncmp(prefix, current.c_str(), len) &&
+ (!*prefix || is_zip_file_separator(*result) || is_zip_file_separator(directory.zipprefix.back())))
{
- const char *result = &directory.zipfile->current_name().c_str()[len];
while (is_zip_file_separator(*result))
result++;
return *result ? result : nullptr;
}
-
- return nullptr;
+ else
+ {
+ return nullptr;
+ }
}