Determine pass_through mount mode based on UID.

We previously using the packagename, but if we start the media process
for another package (eg DownloadProvider, which is hosted in the same
process), then the packagename won't match, and we would mount the FUSE
mount instead.

Bug: 13789012
Test: atest AdoptableHostTest
Change-Id: I9b5fea07f3620b28595274a264f96d9f891f6715
This commit is contained in:
Martijn Coenen
2019-12-03 16:06:19 +01:00
parent ed4645763c
commit 44db1aca43

View File

@@ -354,8 +354,7 @@ class StorageManagerService extends IStorageManager.Stub
@GuardedBy("mLock")
private String mMoveTargetUuid;
@Nullable
private volatile String mMediaStoreAuthorityPackageName = null;
private volatile int mMediaStoreAuthorityAppId = -1;
private volatile int mCurrentUserId = UserHandle.USER_SYSTEM;
@@ -1697,7 +1696,7 @@ class StorageManagerService extends IStorageManager.Stub
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
UserHandle.getUserId(UserHandle.USER_SYSTEM));
if (provider != null) {
mMediaStoreAuthorityPackageName = provider.packageName;
mMediaStoreAuthorityAppId = UserHandle.getAppId(provider.applicationInfo.uid);
}
try {
@@ -3724,8 +3723,10 @@ class StorageManagerService extends IStorageManager.Stub
return Zygote.MOUNT_EXTERNAL_NONE;
}
if (mIsFuseEnabled && packageName.equals(mMediaStoreAuthorityPackageName)) {
// Determine if caller requires pass_through mount
if (mIsFuseEnabled && mMediaStoreAuthorityAppId == UserHandle.getAppId(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.
return Zygote.MOUNT_EXTERNAL_PASS_THROUGH;
}