Fixing Storage Volume listing for Cloned User.

Current implementation only returns the Volumes for the current user.
In case of Cloned user this causes issues as Cloned user uses Media
Provider of User 0, thereby returning only Volume 0, causing problems in
assigning projectIds, and affecting storage calculation.
The projectId assignement happens via
MediaProvider.updateExternalStorageFileQuota.

Bug: 235321217
Test: atest android.appsecurity.cts.StorageHostTest
Change-Id: I617bae9b201fd66d7b62b6cbd1c48b9f276f1924
This commit is contained in:
Himanshu Gupta
2022-09-09 14:02:15 +01:00
parent 636c721c73
commit 4e65c53b43
2 changed files with 8 additions and 3 deletions

View File

@@ -10040,7 +10040,7 @@ package android.os.storage {
method @WorkerThread public long getAllocatableBytes(@NonNull java.util.UUID, @RequiresPermission int) throws java.io.IOException; method @WorkerThread public long getAllocatableBytes(@NonNull java.util.UUID, @RequiresPermission int) throws java.io.IOException;
method @RequiresPermission(android.Manifest.permission.WRITE_MEDIA_STORAGE) public int getExternalStorageMountMode(int, @NonNull String); method @RequiresPermission(android.Manifest.permission.WRITE_MEDIA_STORAGE) public int getExternalStorageMountMode(int, @NonNull String);
method public static boolean hasIsolatedStorage(); method public static boolean hasIsolatedStorage();
method public void updateExternalStorageFileQuotaType(@NonNull java.io.File, int) throws java.io.IOException; method @RequiresPermission(android.Manifest.permission.MANAGE_EXTERNAL_STORAGE) public void updateExternalStorageFileQuotaType(@NonNull java.io.File, int) throws java.io.IOException;
field @RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE) public static final int FLAG_ALLOCATE_AGGRESSIVE = 1; // 0x1 field @RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE) public static final int FLAG_ALLOCATE_AGGRESSIVE = 1; // 0x1
field public static final int MOUNT_MODE_EXTERNAL_ANDROID_WRITABLE = 4; // 0x4 field public static final int MOUNT_MODE_EXTERNAL_ANDROID_WRITABLE = 4; // 0x4
field public static final int MOUNT_MODE_EXTERNAL_DEFAULT = 1; // 0x1 field public static final int MOUNT_MODE_EXTERNAL_DEFAULT = 1; // 0x1

View File

@@ -2549,7 +2549,7 @@ public class StorageManager {
* called on first creation of a new file on external storage, and whenever the * called on first creation of a new file on external storage, and whenever the
* media type of the file is updated later. * media type of the file is updated later.
* *
* This API doesn't require any special permissions, though typical implementations * This API requires MANAGE_EXTERNAL_STORAGE permission and typical implementations
* will require being called from an SELinux domain that allows setting file attributes * will require being called from an SELinux domain that allows setting file attributes
* related to quota (eg the GID or project ID). * related to quota (eg the GID or project ID).
* *
@@ -2568,11 +2568,16 @@ public class StorageManager {
* @hide * @hide
*/ */
@SystemApi @SystemApi
@RequiresPermission(android.Manifest.permission.MANAGE_EXTERNAL_STORAGE)
public void updateExternalStorageFileQuotaType(@NonNull File path, public void updateExternalStorageFileQuotaType(@NonNull File path,
@QuotaType int quotaType) throws IOException { @QuotaType int quotaType) throws IOException {
long projectId; long projectId;
final String filePath = path.getCanonicalPath(); final String filePath = path.getCanonicalPath();
final StorageVolume volume = getStorageVolume(path); // MANAGE_EXTERNAL_STORAGE permission is required as FLAG_INCLUDE_SHARED_PROFILE is being
// set while querying getVolumeList.
final StorageVolume[] availableVolumes = getVolumeList(mContext.getUserId(),
FLAG_REAL_STATE | FLAG_INCLUDE_INVISIBLE | FLAG_INCLUDE_SHARED_PROFILE);
final StorageVolume volume = getStorageVolume(availableVolumes, path);
if (volume == null) { if (volume == null) {
Log.w(TAG, "Failed to update quota type for " + filePath); Log.w(TAG, "Failed to update quota type for " + filePath);
return; return;