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

Commit b34fcce0 authored by Doug Zongker's avatar Doug Zongker
Browse files

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
parent 0052f75f
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -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

+4 −2
Original line number Diff line number Diff line
@@ -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