From 0c00e5236efe7d31e63283101a600691239a4f9b Mon Sep 17 00:00:00 2001 From: Keun young Park Date: Wed, 17 Jun 2020 14:27:37 -0700 Subject: [PATCH] Remove only selected messages for vold reset - Resetting all pending messages can lead into secondary user losing unlocking event in automotive devices. - Only remove selected messages like RESET, VOLUME_MOUNT/UNMOUNT/BROADCAST. Bug: 151457974 Test: try reboot in auto devices where this race can happen. run cts: atest android.appsecurity.cts.AdoptableHostTest Change-Id: Iee52b4ee76f07e0c7aaaa6f0dfa480aeef1df2e9 --- .../java/com/android/server/StorageManagerService.java | 7 ++++++- .../android/server/storage/StorageSessionController.java | 5 ++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 1ce3dfe9f3a0d..850f1c32646db 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -1083,7 +1083,12 @@ class StorageManagerService extends IStorageManager.Stub final List users = mContext.getSystemService(UserManager.class).getUsers(); if (mIsFuseEnabled) { - mStorageSessionController.onReset(mVold, mHandler); + mStorageSessionController.onReset(mVold, () -> { + mHandler.removeMessages(H_RESET); + mHandler.removeMessages(H_VOLUME_BROADCAST); + mHandler.removeMessages(H_VOLUME_MOUNT); + mHandler.removeMessages(H_VOLUME_UNMOUNT); + }); } else { killMediaProvider(users); } diff --git a/services/core/java/com/android/server/storage/StorageSessionController.java b/services/core/java/com/android/server/storage/StorageSessionController.java index 0fd77b9c03dd8..37df5481d3c4b 100644 --- a/services/core/java/com/android/server/storage/StorageSessionController.java +++ b/services/core/java/com/android/server/storage/StorageSessionController.java @@ -27,7 +27,6 @@ import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; -import android.os.Handler; import android.os.IVold; import android.os.ParcelFileDescriptor; import android.os.RemoteException; @@ -238,7 +237,7 @@ public final class StorageSessionController { * * Does nothing if {@link #shouldHandle} is {@code false} **/ - public void onReset(IVold vold, Handler handler) { + public void onReset(IVold vold, Runnable resetHandlerRunnable) { if (!shouldHandle(null)) { return; } @@ -280,7 +279,7 @@ public final class StorageSessionController { connection.close(); } - handler.removeCallbacksAndMessages(null); + resetHandlerRunnable.run(); synchronized (mLock) { mConnections.clear(); mIsResetting = false;