diff --git a/tools/zipalign/ZipFile.cpp b/tools/zipalign/ZipFile.cpp index 6037d595da..f2f65a63bc 100644 --- a/tools/zipalign/ZipFile.cpp +++ b/tools/zipalign/ZipFile.cpp @@ -530,7 +530,7 @@ status_t ZipFile::alignEntry(android::ZipEntry* pEntry, uint32_t alignTo){ // If the alignment is not what was requested, add some padding in the extra // so the payload ends up where is requested. uint64_t alignDiff = alignTo - (expectedPayloadOffset % alignTo); - if (alignDiff == 0) + if (alignDiff == alignTo) return OK; return pEntry->addPadding(alignDiff); diff --git a/tools/zipalign/tests/src/align_test.cpp b/tools/zipalign/tests/src/align_test.cpp index c79e791e41..96d4f7365f 100644 --- a/tools/zipalign/tests/src/align_test.cpp +++ b/tools/zipalign/tests/src/align_test.cpp @@ -9,6 +9,7 @@ #include using namespace android; +using namespace base; static std::string GetTestPath(const std::string& filename) { static std::string test_data_dir = android::base::GetExecutableDirectory() + "/tests/data/"; @@ -26,6 +27,34 @@ TEST(Align, Unaligned) { ASSERT_EQ(0, verified); } +TEST(Align, DoubleAligment) { + const std::string src = GetTestPath("unaligned.zip"); + const std::string tmp = GetTestPath("da_aligned.zip"); + const std::string dst = GetTestPath("da_d_aligner.zip"); + + int processed = process(src.c_str(), tmp.c_str(), 4, true, false, 4096); + ASSERT_EQ(0, processed); + + int verified = verify(tmp.c_str(), 4, true, false); + ASSERT_EQ(0, verified); + + // Align the result of the previous run. Essentially double aligning. + processed = process(tmp.c_str(), dst.c_str(), 4, true, false, 4096); + ASSERT_EQ(0, processed); + + verified = verify(dst.c_str(), 4, true, false); + ASSERT_EQ(0, verified); + + // Nothing should have changed between tmp and dst. + std::string tmp_content; + ASSERT_EQ(true, ReadFileToString(tmp, &tmp_content)); + + std::string dst_content; + ASSERT_EQ(true, ReadFileToString(dst, &dst_content)); + + ASSERT_EQ(tmp_content, dst_content); +} + // Align a zip featuring a hole at the beginning. The // hole in the archive is a delete entry in the Central // Directory.