diff options
author | 2024-03-21 18:59:07 +0000 | |
---|---|---|
committer | 2024-03-21 19:14:42 +0000 | |
commit | 1a67da888fb2a590622328c98e0efb7b4b4150cb (patch) | |
tree | c255d99534d263e89b508518d8e2e0a7ee29f19b /services/backup | |
parent | 0c43ad7befd422153576b90ed6b0b38bd6ae28f4 (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.java | 16 |
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; } |