From: Doug Zongker Date: Thu, 11 Sep 2014 16:34:56 +0000 (-0700) Subject: explicitly check the superblock for differences X-Git-Tag: android-x86-6.0-r1~144^2~1^2~201 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=b34fcce08cc9ab358481e672d83ff16513c4ac37;p=android-x86%2Fbuild.git explicitly check the superblock for differences When generating incrementals for the system and vendor partitions, check the first block (which contains the superblock) of the partition to see if it's what we expect. If this check fails, give an explicit log message about the partition having been remounted R/W (the most likely explanation) and the need to flash to get OTAs working again. Bug: 17393999 Change-Id: Ifd2132b428dbc4907527291712690204a3664ac0 --- diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 92d912bd6..815c76ca2 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -30,6 +30,7 @@ import time import zipfile import blockimgdiff +from rangelib import * try: from hashlib import sha1 as sha1 @@ -1023,10 +1024,11 @@ def ComputeDifferences(diffs): class BlockDifference: - def __init__(self, partition, tgt, src=None): + def __init__(self, partition, tgt, src=None, check_first_block=False): self.tgt = tgt self.src = src self.partition = partition + self.check_first_block = check_first_block b = blockimgdiff.BlockImageDiff(tgt, src, threads=OPTIONS.worker_threads) tmpdir = tempfile.mkdtemp() @@ -1043,6 +1045,9 @@ class BlockDifference: self._WriteUpdate(script, output_zip) else: + if self.check_first_block: + self._CheckFirstBlock(script) + script.AppendExtra('if range_sha1("%s", "%s") == "%s" then' % (self.device, self.src.care_map.to_string_raw(), self.src.TotalSha1())) @@ -1072,6 +1077,18 @@ class BlockDifference: (self.device, partition, partition, partition)) script.AppendExtra(script._WordWrap(call)) + def _CheckFirstBlock(self, script): + r = RangeSet((0, 1)) + h = sha1() + for data in self.src.ReadRangeSet(r): + h.update(data) + h = h.hexdigest() + + script.AppendExtra(('(range_sha1("%s", "%s") == "%s") || ' + 'abort("%s has been remounted R/W; ' + 'reflash device to reenable OTA updates");') + % (self.device, r.to_string_raw(), h, self.device)) + DataImage = blockimgdiff.DataImage diff --git a/tools/releasetools/ota_from_target_files b/tools/releasetools/ota_from_target_files index 8b7342b9d..6f344504b 100755 --- a/tools/releasetools/ota_from_target_files +++ b/tools/releasetools/ota_from_target_files @@ -731,14 +731,16 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): system_src = GetImage("system", OPTIONS.source_tmp, OPTIONS.source_info_dict) system_tgt = GetImage("system", OPTIONS.target_tmp, OPTIONS.target_info_dict) - system_diff = common.BlockDifference("system", system_tgt, system_src) + system_diff = common.BlockDifference("system", system_tgt, system_src, + check_first_block=True) if HasVendorPartition(target_zip): if not HasVendorPartition(source_zip): raise RuntimeError("can't generate incremental that adds /vendor") vendor_src = GetImage("vendor", OPTIONS.source_tmp, OPTIONS.source_info_dict) vendor_tgt = GetImage("vendor", OPTIONS.target_tmp, OPTIONS.target_info_dict) - vendor_diff = common.BlockDifference("vendor", vendor_tgt, vendor_src) + vendor_diff = common.BlockDifference("vendor", vendor_tgt, vendor_src, + check_first_block=True) else: vendor_diff = None