summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Fabien Sanglard <sanglardf@google.com> 2021-09-14 14:18:31 -0700
committer Fabien Sanglard <sanglardf@google.com> 2021-09-14 15:20:42 -0700
commitdf73d1b4733b8b3cdfd96199018455026ba8d9d2 (patch)
treec7b06a6ca03da4f8b07937306cd9d474ec6685b4
parent1011d45f5b5230fdc031f654f701e511dd4d935c (diff)
Zipalign: Avoid unnecessary padding
Problem: Aligned entry always get padded to the next aligned slot. Solution: Fix alignment test. Bug: 199932309 Test: align_test.cpp Change-Id: I1e61c67dcf45454dd782d0fcc6903f7e71954083
-rw-r--r--tools/zipalign/ZipFile.cpp2
-rw-r--r--tools/zipalign/tests/src/align_test.cpp29
2 files changed, 30 insertions, 1 deletions
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 <android-base/file.h>
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.