Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9371dc17 authored by Mårten Kongstad's avatar Mårten Kongstad Committed by Todd Kennedy
Browse files

idmap2: include AndroidManifest.xml in CRCs

The CRCs stored in the idmap file header are copies of the zip file CRC for the
resources.arsc entry in the target and overlay package apks, and are used to
quickly check if either package's contents has changed, which in turn means the
idmap file must be recreated.

With the introduction of named targets, just checking the resources.arsc file is no
longer sufficient: an overlay package could be installed with targetName="a" and
updated to targetName="b". This change is not reflected in the resources.arsc file,
only in the AndroidManifest.xml.

To account for this, update the CRC in the idmap file header from

    CRC(resources.arsc)

to

    CRC(resources.arsc) ^ CRC(AndroidManifest.xml)

Test: make idmap2_tests
Bug: 119761809
Change-Id: Ieb0c6b466ac23eb81a2670a32309fa46ade5c5c8
parent d136a7a2
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -117,6 +117,12 @@ const LoadedPackage* GetPackageAtIndex0(const LoadedArsc& loaded_arsc) {
  return loaded_arsc.GetPackageById(id);
}

Result<uint32_t> GetCrc(const ZipFile& zip) {
  const Result<uint32_t> a = zip.Crc("resources.arsc");
  const Result<uint32_t> b = zip.Crc("AndroidManifest.xml");
  return a && b ? Result<uint32_t>(*a ^ *b) : kResultError;
}

}  // namespace

std::unique_ptr<const IdmapHeader> IdmapHeader::FromBinaryStream(std::istream& stream) {
@@ -153,7 +159,7 @@ bool IdmapHeader::IsUpToDate(std::ostream& out_error) const {
    return false;
  }

  Result<uint32_t> target_crc = target_zip->Crc("resources.arsc");
  Result<uint32_t> target_crc = GetCrc(*target_zip);
  if (!target_crc) {
    out_error << "error: failed to get target crc" << std::endl;
    return false;
@@ -173,7 +179,7 @@ bool IdmapHeader::IsUpToDate(std::ostream& out_error) const {
    return false;
  }

  Result<uint32_t> overlay_crc = overlay_zip->Crc("resources.arsc");
  Result<uint32_t> overlay_crc = GetCrc(*overlay_zip);
  if (!overlay_crc) {
    out_error << "error: failed to get overlay crc" << std::endl;
    return false;
@@ -356,14 +362,14 @@ std::unique_ptr<const Idmap> Idmap::FromApkAssets(
  header->magic_ = kIdmapMagic;
  header->version_ = kIdmapCurrentVersion;

  Result<uint32_t> crc = target_zip->Crc("resources.arsc");
  Result<uint32_t> crc = GetCrc(*target_zip);
  if (!crc) {
    out_error << "error: failed to get zip crc for target" << std::endl;
    return nullptr;
  }
  header->target_crc_ = *crc;

  crc = overlay_zip->Crc("resources.arsc");
  crc = GetCrc(*overlay_zip);
  if (!crc) {
    out_error << "error: failed to get zip crc for overlay" << std::endl;
    return nullptr;
+2 −2
Original line number Diff line number Diff line
@@ -191,8 +191,8 @@ TEST(IdmapTests, CreateIdmapFromApkAssets) {
  ASSERT_THAT(idmap->GetHeader(), NotNull());
  ASSERT_EQ(idmap->GetHeader()->GetMagic(), 0x504d4449U);
  ASSERT_EQ(idmap->GetHeader()->GetVersion(), 0x01U);
  ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), 0xab7cf70d);
  ASSERT_EQ(idmap->GetHeader()->GetOverlayCrc(), 0xd470336b);
  ASSERT_EQ(idmap->GetHeader()->GetTargetCrc(), 0xdd53ca29);
  ASSERT_EQ(idmap->GetHeader()->GetOverlayCrc(), 0xa71ccd77);
  ASSERT_EQ(idmap->GetHeader()->GetTargetPath().to_string(), target_apk_path);
  ASSERT_EQ(idmap->GetHeader()->GetOverlayPath(), overlay_apk_path);
  ASSERT_EQ(idmap->GetHeader()->GetOverlayPath(), overlay_apk_path);
+2 −2
Original line number Diff line number Diff line
@@ -52,8 +52,8 @@ TEST(RawPrintVisitorTests, CreateRawPrintVisitor) {

  ASSERT_NE(stream.str().find("00000000: 504d4449  magic\n"), std::string::npos);
  ASSERT_NE(stream.str().find("00000004: 00000001  version\n"), std::string::npos);
  ASSERT_NE(stream.str().find("00000008: ab7cf70d  target crc\n"), std::string::npos);
  ASSERT_NE(stream.str().find("0000000c: d470336b  overlay crc\n"), std::string::npos);
  ASSERT_NE(stream.str().find("00000008: dd53ca29  target crc\n"), std::string::npos);
  ASSERT_NE(stream.str().find("0000000c: a71ccd77  overlay crc\n"), std::string::npos);
  ASSERT_NE(stream.str().find("0000021c: 00000000  0x7f010000 -> 0x7f010000 integer/int1\n"),
            std::string::npos);
}