summaryrefslogtreecommitdiff
path: root/services/backup
diff options
context:
space:
mode:
author Joël Stemmer <jstemmer@google.com> 2024-03-21 18:59:07 +0000
committer Joël Stemmer <jstemmer@google.com> 2024-03-21 19:14:42 +0000
commit1a67da888fb2a590622328c98e0efb7b4b4150cb (patch)
treec255d99534d263e89b508518d8e2e0a7ee29f19b /services/backup
parent0c43ad7befd422153576b90ed6b0b38bd6ae28f4 (diff)
Avoid entering an infinite loop in PackageManagerBackupAgent#onRestore
When the PackageManagerBackupAgent restores an old backup that does not have an ancestral record version and the backup contains a package that does not have any signatures it will enter an infinite loop. This happens because it calls `continue` without reading the next key/value pair in the backup. Test: atest PackageManagerBackupAgentTest Bug: 330708733 Change-Id: Ifb71293b75ccb68dc7e721593f04128417360491
Diffstat (limited to 'services/backup')
-rw-r--r--services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java16
1 files changed, 8 insertions, 8 deletions
diff --git a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
index c3d97904e430..52108bf1568d 100644
--- a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
+++ b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
@@ -781,6 +781,9 @@ public class PackageManagerBackupAgent extends BackupAgent {
"Not restoring package "
+ key
+ " since it appears to have no signatures.");
+ if (!data.readNextHeader()) {
+ break;
+ }
continue;
}
@@ -790,18 +793,15 @@ public class PackageManagerBackupAgent extends BackupAgent {
sigMap.put(key, new Metadata(versionCode, sigs));
}
- boolean readNextHeader = data.readNextHeader();
- if (!readNextHeader) {
- if (DEBUG) {
- Slog.v(
- TAG,
- "LegacyRestoreDataConsumer:"
- + " we're done reading all the headers");
- }
+ if (!data.readNextHeader()) {
break;
}
}
+ if (DEBUG) {
+ Slog.v(TAG, "LegacyRestoreDataConsumer:" + " we're done reading all the headers");
+ }
+
// On successful completion, cache the signature map for the Backup Manager to use
mRestoredSignatures = sigMap;
}