diff options
| author | 2020-03-16 15:55:06 +0000 | |
|---|---|---|
| committer | 2020-03-16 18:35:08 +0000 | |
| commit | e25c92d13a3cc2d3a2cda78cc55669b4c1aee5bb (patch) | |
| tree | 31a37e6437cb7b627fff8d2bbb4fa5df7ef38fad | |
| parent | bac0268f63afa87c713d2f0a2ea32a6b85d92660 (diff) | |
Do not mount storage obb&data dirs in fuse daemon process
Otherwise, fuse daemon will be killed during storage dir remount.
Also, fix wrong uid in prepareObbDirs() for multi-user case.
Bug: 151452792
Bug: 151436460
Test: atest AdoptableHostTest
Change-Id: Ib0d4cba36bc1bc91f31583c6a97d37203ac8b88d
3 files changed, 21 insertions, 7 deletions
diff --git a/core/java/android/os/storage/StorageManagerInternal.java b/core/java/android/os/storage/StorageManagerInternal.java index f43a2523b5b3..e05991b33796 100644 --- a/core/java/android/os/storage/StorageManagerInternal.java +++ b/core/java/android/os/storage/StorageManagerInternal.java @@ -144,4 +144,10 @@ public abstract class StorageManagerInternal { * @param uid the uid of the package */ public abstract void prepareAppDataAfterInstall(@NonNull String packageName, int uid); + + + /** + * Return true if uid is external storage service. + */ + public abstract boolean isExternalStorageService(int uid); } diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 2c220d3f8861..5a056d35f87a 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -4076,7 +4076,7 @@ class StorageManagerService extends IStorageManager.Stub return Zygote.MOUNT_EXTERNAL_NONE; } - if (mIsFuseEnabled && mMediaStoreAuthorityAppId == UserHandle.getAppId(uid)) { + if (mIsFuseEnabled && mStorageManagerInternal.isExternalStorageService(uid)) { // Determine if caller requires pass_through mount; note that we do this for // all processes that share a UID with MediaProvider; but this is fine, since // those processes anyway share the same rights as MediaProvider. @@ -4422,14 +4422,16 @@ class StorageManagerService extends IStorageManager.Stub String.format("/storage/emulated/%d/Android/data/%s/", userId, pkg); + int appUid = + UserHandle.getUid(userId, mPmInternal.getPackage(pkg).getUid()); // Create package obb and data dir if it doesn't exist. File file = new File(packageObbDir); if (!file.exists()) { - vold.setupAppDir(packageObbDir, mPmInternal.getPackage(pkg).getUid()); + vold.setupAppDir(packageObbDir, appUid); } file = new File(packageDataDir); if (!file.exists()) { - vold.setupAppDir(packageDataDir, mPmInternal.getPackage(pkg).getUid()); + vold.setupAppDir(packageDataDir, appUid); } } } catch (ServiceManager.ServiceNotFoundException | RemoteException e) { @@ -4524,6 +4526,11 @@ class StorageManagerService extends IStorageManager.Stub } } + @Override + public boolean isExternalStorageService(int uid) { + return mMediaStoreAuthorityAppId == UserHandle.getAppId(uid); + } + public boolean hasExternalStorage(int uid, String packageName) { // No need to check for system uid. This avoids a deadlock between // PackageManagerService and AppOpsService. diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 57bd42bfd05e..16a7c6b4998e 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -2192,11 +2192,12 @@ public final class ProcessList { app.setHasForegroundActivities(true); } + StorageManagerInternal storageManagerInternal = LocalServices.getService( + StorageManagerInternal.class); final Map<String, Pair<String, Long>> pkgDataInfoMap; boolean bindMountAppStorageDirs = false; if (shouldIsolateAppData(app)) { - bindMountAppStorageDirs = mVoldAppDataIsolationEnabled; // Get all packages belongs to the same shared uid. sharedPackages is empty array // if it doesn't have shared uid. final PackageManagerInternal pmInt = mService.getPackageManagerInternalLocked(); @@ -2206,9 +2207,9 @@ public final class ProcessList { ? new String[]{app.info.packageName} : sharedPackages, uid); int userId = UserHandle.getUserId(uid); - if (mVoldAppDataIsolationEnabled) { - StorageManagerInternal storageManagerInternal = LocalServices.getService( - StorageManagerInternal.class); + if (mVoldAppDataIsolationEnabled && UserHandle.isApp(app.uid) && + !storageManagerInternal.isExternalStorageService(uid)) { + bindMountAppStorageDirs = true; if (!storageManagerInternal.prepareStorageDirs(userId, pkgDataInfoMap.keySet(), app.processName)) { // Cannot prepare Android/app and Android/obb directory, |