From 7dfbaf52db6401ae85588e334be5af751bb813a8 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Tue, 29 Jul 2014 13:47:47 -0700 Subject: Make archive metadata idempotent We want to make sure that the manifest and widget metadata blocks are identical, including their in-stream headers, if we regenerate the archive without underlying filesystem changes. Bug 15968355 Change-Id: I828b264545d19e1d865d98d5723915d02fafc012 --- .../java/com/android/server/backup/BackupManagerService.java | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'services/backup/java') diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 9659b79..d434d7a 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -3151,6 +3151,13 @@ public class BackupManagerService extends IBackupManager.Stub { FileOutputStream outstream = new FileOutputStream(manifestFile); outstream.write(builder.toString().getBytes()); outstream.close(); + + // We want the manifest block in the archive stream to be idempotent: + // each time we generate a backup stream for the app, we want the manifest + // block to be identical. The underlying tar mechanism sees it as a file, + // though, and will propagate its mtime, causing the tar header to vary. + // Avoid this problem by pinning the mtime to zero. + manifestFile.setLastModified(0); } // Widget metadata format. All header entries are strings ending in LF: @@ -3188,6 +3195,10 @@ public class BackupManagerService extends IBackupManager.Stub { } bout.flush(); out.close(); + + // As with the manifest file, guarantee idempotence of the archive metadata + // for the widget block by using a fixed mtime on the transient file. + destination.setLastModified(0); } private void tearDown(PackageInfo pkg) { -- cgit v1.1