From 8a7ed9f771408bc4c3ef8a9a578020392305d115 Mon Sep 17 00:00:00 2001 From: Tianjie Xu Date: Tue, 23 Jan 2018 14:06:11 -0800 Subject: [PATCH] Double check the sha1 for ranges during package generation Check that the Sha1 for src&tgt ranges are correct before computing patches. This adds ~6 seconds overhead for ~2400 commands. Bug: 71908713 Test: Generate an incremental package from angler 4208095 to 4442250. Change-Id: I8cf8ce132fb09a22f7d6689274ddb4a27770be76 --- tools/releasetools/blockimgdiff.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py index f366853e0..1a7b933c4 100644 --- a/tools/releasetools/blockimgdiff.py +++ b/tools/releasetools/blockimgdiff.py @@ -362,6 +362,7 @@ class BlockImageDiff(object): # Double-check our work. self.AssertSequenceGood() + self.AssertSha1Good() self.ComputePatches(prefix) self.WriteTransfers(prefix) @@ -867,6 +868,21 @@ class BlockImageDiff(object): xf.tgt_name + " (from " + xf.src_name + ")"), xf.tgt_ranges, xf.src_ranges)) + def AssertSha1Good(self): + """Check the SHA-1 of the src & tgt blocks in the transfer list. + + Double check the SHA-1 value to avoid the issue in b/71908713, where + SparseImage.RangeSha1() messed up with the hash calculation in multi-thread + environment. That specific problem has been fixed by protecting the + underlying generator function 'SparseImage._GetRangeData()' with lock. + """ + for xf in self.transfers: + tgt_sha1 = self.tgt.RangeSha1(xf.tgt_ranges) + assert xf.tgt_sha1 == tgt_sha1 + if xf.style == "diff": + src_sha1 = self.src.RangeSha1(xf.src_ranges) + assert xf.src_sha1 == src_sha1 + def AssertSequenceGood(self): # Simulate the sequences of transfers we will output, and check that: # - we never read a block after writing it, and