Fix for archives containing directories like foobar following foo

This commit is contained in:
Vas Crabb 2016-04-10 15:47:51 +10:00
parent 760b4bd93b
commit d74f5db813

View File

@ -942,10 +942,10 @@ const osd_directory_entry *zippath_readdir(zippath_directory *directory)
{ {
result = osd_readdir(directory->directory); result = osd_readdir(directory->directory);
} }
while((result != nullptr) && (!strcmp(result->name, ".") || !strcmp(result->name, ".."))); while (result && (!strcmp(result->name, ".") || !strcmp(result->name, "..")));
/* special case - is this entry a ZIP file? if so we need to return it as a "directory" */ /* special case - is this entry a ZIP file? if so we need to return it as a "directory" */
if ((result != nullptr) && (is_zip_file(result->name) || is_7z_file(result->name))) if (result && (is_zip_file(result->name) || is_7z_file(result->name)))
{ {
/* copy; but change the entry type */ /* copy; but change the entry type */
directory->returned_entry = *result; directory->returned_entry = *result;
@ -977,10 +977,11 @@ const osd_directory_entry *zippath_readdir(zippath_directory *directory)
if (*separator || directory->zipfile->current_is_directory()) if (*separator || directory->zipfile->current_is_directory())
{ {
/* a nested entry; loop through returned_dirlist to see if we've returned the parent directory */ /* a nested entry; loop through returned_dirlist to see if we've returned the parent directory */
auto const len(separator - relpath);
zippath_returned_directory *rdent; zippath_returned_directory *rdent;
for (rdent = directory->returned_dirlist; rdent != nullptr; rdent = rdent->next) for (rdent = directory->returned_dirlist; rdent != nullptr; rdent = rdent->next)
{ {
if (!core_strnicmp(rdent->name.c_str(), relpath, separator - relpath + 1)) if ((rdent->name.length() == len) && !core_strnicmp(rdent->name.c_str(), relpath, len))
break; break;
} }