summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author JW Wang <wangchun@google.com> 2020-07-07 06:09:32 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-07-07 06:09:32 +0000
commit6a97ba76d8dc654c615674bb38d469e0fbbbd0fd (patch)
treec19c36164c1e9c0c4a6b7b2f65d9cf6fa0cb96ee
parent2cb25c319079fb582b7731d7d840896bbd31b111 (diff)
parent9e6b95e500bd3aaa59fa8eea5c00bf68c3289e58 (diff)
Merge changes I130736e0,I47ad6c84
* changes: Protect mIncrementalFileStorages with mLock (2/n) Protect access to mChildSessionIds with mLock (1/n)
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java47
1 files changed, 31 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 5f488711ceb1..ca16d5730f78 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -405,7 +405,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private boolean mDataLoaderFinished = false;
- // TODO(b/159663586): should be protected by mLock
+ @GuardedBy("mLock")
private IncrementalFileStorages mIncrementalFileStorages;
private static final FileFilter sAddedApkFilter = new FileFilter() {
@@ -1125,13 +1125,18 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
return;
}
if (isMultiPackage()) {
- final SparseIntArray remainingSessions = mChildSessionIds.clone();
+ final SparseIntArray remainingSessions;
+ final int[] childSessionIds;
+ synchronized (mLock) {
+ remainingSessions = mChildSessionIds.clone();
+ childSessionIds = mChildSessionIds.copyKeys();
+ }
final IntentSender childIntentSender =
new ChildStatusIntentReceiver(remainingSessions, statusReceiver)
.getIntentSender();
boolean sealFailed = false;
- for (int i = mChildSessionIds.size() - 1; i >= 0; --i) {
- final int childSessionId = mChildSessionIds.keyAt(i);
+ for (int i = childSessionIds.length - 1; i >= 0; --i) {
+ final int childSessionId = childSessionIds[i];
// seal all children, regardless if any of them fail; we'll throw/return
// as appropriate once all children have been processed
if (!mSessionProvider.getSession(childSessionId)
@@ -1163,13 +1168,17 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
if (isMultiPackage()) {
- int childCount = mChildSessionIds.size();
+ final int[] childSessionIds;
+ synchronized (mLock) {
+ childSessionIds = mChildSessionIds.copyKeys();
+ }
+ int childCount = childSessionIds.length;
// This will contain all child sessions that do not encounter an unrecoverable failure
ArrayList<PackageInstallerSession> nonFailingSessions = new ArrayList<>(childCount);
for (int i = childCount - 1; i >= 0; --i) {
- final int childSessionId = mChildSessionIds.keyAt(i);
+ final int childSessionId = childSessionIds[i];
// commit all children, regardless if any of them fail; we'll throw/return
// as appropriate once all children have been processed
try {
@@ -2588,7 +2597,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
* Adds a child session ID without any safety / sanity checks. This should only be used to
* build a session from XML or similar.
*/
- void addChildSessionIdInternal(int sessionId) {
+ @GuardedBy("mLock")
+ void addChildSessionIdLocked(int sessionId) {
mChildSessionIds.put(sessionId, 0);
}
@@ -2964,7 +2974,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
@Override
public int[] getChildSessionIds() {
- final int[] childSessionIds = mChildSessionIds.copyKeys();
+ final int[] childSessionIds;
+ synchronized (mLock) {
+ childSessionIds = mChildSessionIds.copyKeys();
+ }
if (childSessionIds != null) {
return childSessionIds;
}
@@ -2990,7 +3003,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
return;
}
childSession.setParentSessionId(this.sessionId);
- addChildSessionIdInternal(childSessionId);
+ addChildSessionIdLocked(childSessionId);
}
}
@@ -3157,10 +3170,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
for (FileBridge bridge : mBridges) {
bridge.forceClose();
}
- }
- if (mIncrementalFileStorages != null) {
- mIncrementalFileStorages.cleanUp();
- mIncrementalFileStorages = null;
+ if (mIncrementalFileStorages != null) {
+ mIncrementalFileStorages.cleanUp();
+ mIncrementalFileStorages = null;
+ }
}
// For staged sessions, we don't delete the directory where the packages have been copied,
// since these packages are supposed to be read on reboot.
@@ -3197,9 +3210,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
private void cleanStageDir() {
- if (mIncrementalFileStorages != null) {
- mIncrementalFileStorages.cleanUp();
- mIncrementalFileStorages = null;
+ synchronized (mLock) {
+ if (mIncrementalFileStorages != null) {
+ mIncrementalFileStorages.cleanUp();
+ mIncrementalFileStorages = null;
+ }
}
try {
mPm.mInstaller.rmPackageDir(stageDir.getAbsolutePath());