diff options
author | Yusuke Sato <yusukes@google.com> | 2015-06-25 14:09:00 -0700 |
---|---|---|
committer | Yusuke Sato <yusukes@google.com> | 2015-06-25 14:10:05 -0700 |
commit | f1d3d3b2477a813805b71099c60e07d36dbb225a (patch) | |
tree | f39320a18f9d80f044463eb5e8b8e317d5665252 /libziparchive | |
parent | 3c233b36c2ffd6e1186ccc3d2c7c7e40b0a3c066 (diff) | |
download | core-f1d3d3b2477a813805b71099c60e07d36dbb225a.tar.gz core-f1d3d3b2477a813805b71099c60e07d36dbb225a.tar.bz2 core-f1d3d3b2477a813805b71099c60e07d36dbb225a.zip |
Add |optional_suffix| to StartIteration()
so that PackageManagerService can iterate over files with a
specific file extension like ".so".
(cherry picked from commit a4a80693d9687982461decdcf86920b3e76bb41a)
Bug: 21957428
Change-Id: I36ba3c33a8b366a65f67cb6d156067c5caca1151
Diffstat (limited to 'libziparchive')
-rw-r--r-- | libziparchive/zip_archive.cc | 43 | ||||
-rw-r--r-- | libziparchive/zip_archive_test.cc | 112 |
2 files changed, 141 insertions, 14 deletions
diff --git a/libziparchive/zip_archive.cc b/libziparchive/zip_archive.cc index d7af34e3c..5f6b8097a 100644 --- a/libziparchive/zip_archive.cc +++ b/libziparchive/zip_archive.cc @@ -852,25 +852,38 @@ struct IterationHandle { // We're not using vector here because this code is used in the Windows SDK // where the STL is not available. const uint8_t* prefix; - uint16_t prefix_len; + const uint16_t prefix_len; + const uint8_t* suffix; + const uint16_t suffix_len; ZipArchive* archive; - IterationHandle() : prefix(NULL), prefix_len(0) {} - - IterationHandle(const ZipEntryName& prefix_name) - : prefix_len(prefix_name.name_length) { - uint8_t* prefix_copy = new uint8_t[prefix_len]; - memcpy(prefix_copy, prefix_name.name, prefix_len); - prefix = prefix_copy; + IterationHandle(const ZipEntryName* prefix_name, + const ZipEntryName* suffix_name) + : prefix(NULL), + prefix_len(prefix_name ? prefix_name->name_length : 0), + suffix(NULL), + suffix_len(suffix_name ? suffix_name->name_length : 0) { + if (prefix_name) { + uint8_t* prefix_copy = new uint8_t[prefix_len]; + memcpy(prefix_copy, prefix_name->name, prefix_len); + prefix = prefix_copy; + } + if (suffix_name) { + uint8_t* suffix_copy = new uint8_t[suffix_len]; + memcpy(suffix_copy, suffix_name->name, suffix_len); + suffix = suffix_copy; + } } ~IterationHandle() { delete[] prefix; + delete[] suffix; } }; int32_t StartIteration(ZipArchiveHandle handle, void** cookie_ptr, - const ZipEntryName* optional_prefix) { + const ZipEntryName* optional_prefix, + const ZipEntryName* optional_suffix) { ZipArchive* archive = reinterpret_cast<ZipArchive*>(handle); if (archive == NULL || archive->hash_table == NULL) { @@ -878,8 +891,7 @@ int32_t StartIteration(ZipArchiveHandle handle, void** cookie_ptr, return kInvalidHandle; } - IterationHandle* cookie = - optional_prefix != NULL ? new IterationHandle(*optional_prefix) : new IterationHandle(); + IterationHandle* cookie = new IterationHandle(optional_prefix, optional_suffix); cookie->position = 0; cookie->archive = archive; @@ -929,7 +941,13 @@ int32_t Next(void* cookie, ZipEntry* data, ZipEntryName* name) { for (uint32_t i = currentOffset; i < hash_table_length; ++i) { if (hash_table[i].name != NULL && (handle->prefix_len == 0 || - (memcmp(handle->prefix, hash_table[i].name, handle->prefix_len) == 0))) { + (hash_table[i].name_length >= handle->prefix_len && + memcmp(handle->prefix, hash_table[i].name, handle->prefix_len) == 0)) && + (handle->suffix_len == 0 || + (hash_table[i].name_length >= handle->suffix_len && + memcmp(handle->suffix, + hash_table[i].name + hash_table[i].name_length - handle->suffix_len, + handle->suffix_len) == 0))) { handle->position = (i + 1); const int error = FindEntry(archive, i, data); if (!error) { @@ -1265,4 +1283,3 @@ const char* ErrorCodeString(int32_t error_code) { int GetFileDescriptor(const ZipArchiveHandle handle) { return reinterpret_cast<ZipArchive*>(handle)->fd; } - diff --git a/libziparchive/zip_archive_test.cc b/libziparchive/zip_archive_test.cc index f8952ce65..c79986957 100644 --- a/libziparchive/zip_archive_test.cc +++ b/libziparchive/zip_archive_test.cc @@ -115,7 +115,7 @@ TEST(ziparchive, Iteration) { ASSERT_EQ(0, OpenArchiveWrapper(kValidZip, &handle)); void* iteration_cookie; - ASSERT_EQ(0, StartIteration(handle, &iteration_cookie, NULL)); + ASSERT_EQ(0, StartIteration(handle, &iteration_cookie, NULL, NULL)); ZipEntry data; ZipEntryName name; @@ -146,6 +146,116 @@ TEST(ziparchive, Iteration) { CloseArchive(handle); } +TEST(ziparchive, IterationWithPrefix) { + ZipArchiveHandle handle; + ASSERT_EQ(0, OpenArchiveWrapper(kValidZip, &handle)); + + void* iteration_cookie; + ZipEntryName prefix("b/"); + ASSERT_EQ(0, StartIteration(handle, &iteration_cookie, &prefix, NULL)); + + ZipEntry data; + ZipEntryName name; + + // b/c.txt + ASSERT_EQ(0, Next(iteration_cookie, &data, &name)); + AssertNameEquals("b/c.txt", name); + + // b/d.txt + ASSERT_EQ(0, Next(iteration_cookie, &data, &name)); + AssertNameEquals("b/d.txt", name); + + // b/ + ASSERT_EQ(0, Next(iteration_cookie, &data, &name)); + AssertNameEquals("b/", name); + + // End of iteration. + ASSERT_EQ(-1, Next(iteration_cookie, &data, &name)); + + CloseArchive(handle); +} + +TEST(ziparchive, IterationWithSuffix) { + ZipArchiveHandle handle; + ASSERT_EQ(0, OpenArchiveWrapper(kValidZip, &handle)); + + void* iteration_cookie; + ZipEntryName suffix(".txt"); + ASSERT_EQ(0, StartIteration(handle, &iteration_cookie, NULL, &suffix)); + + ZipEntry data; + ZipEntryName name; + + // b/c.txt + ASSERT_EQ(0, Next(iteration_cookie, &data, &name)); + AssertNameEquals("b/c.txt", name); + + // b/d.txt + ASSERT_EQ(0, Next(iteration_cookie, &data, &name)); + AssertNameEquals("b/d.txt", name); + + // a.txt + ASSERT_EQ(0, Next(iteration_cookie, &data, &name)); + AssertNameEquals("a.txt", name); + + // b.txt + ASSERT_EQ(0, Next(iteration_cookie, &data, &name)); + AssertNameEquals("b.txt", name); + + // End of iteration. + ASSERT_EQ(-1, Next(iteration_cookie, &data, &name)); + + CloseArchive(handle); +} + +TEST(ziparchive, IterationWithPrefixAndSuffix) { + ZipArchiveHandle handle; + ASSERT_EQ(0, OpenArchiveWrapper(kValidZip, &handle)); + + void* iteration_cookie; + ZipEntryName prefix("b"); + ZipEntryName suffix(".txt"); + ASSERT_EQ(0, StartIteration(handle, &iteration_cookie, &prefix, &suffix)); + + ZipEntry data; + ZipEntryName name; + + // b/c.txt + ASSERT_EQ(0, Next(iteration_cookie, &data, &name)); + AssertNameEquals("b/c.txt", name); + + // b/d.txt + ASSERT_EQ(0, Next(iteration_cookie, &data, &name)); + AssertNameEquals("b/d.txt", name); + + // b.txt + ASSERT_EQ(0, Next(iteration_cookie, &data, &name)); + AssertNameEquals("b.txt", name); + + // End of iteration. + ASSERT_EQ(-1, Next(iteration_cookie, &data, &name)); + + CloseArchive(handle); +} + +TEST(ziparchive, IterationWithBadPrefixAndSuffix) { + ZipArchiveHandle handle; + ASSERT_EQ(0, OpenArchiveWrapper(kValidZip, &handle)); + + void* iteration_cookie; + ZipEntryName prefix("x"); + ZipEntryName suffix("y"); + ASSERT_EQ(0, StartIteration(handle, &iteration_cookie, &prefix, &suffix)); + + ZipEntry data; + ZipEntryName name; + + // End of iteration. + ASSERT_EQ(-1, Next(iteration_cookie, &data, &name)); + + CloseArchive(handle); +} + TEST(ziparchive, FindEntry) { ZipArchiveHandle handle; ASSERT_EQ(0, OpenArchiveWrapper(kValidZip, &handle)); |