From 7395cbf07048abdad24b056f30a46f5b67920cd8 Mon Sep 17 00:00:00 2001 From: Svetoslav Date: Wed, 15 Jul 2015 15:58:01 -0700 Subject: [PATCH] Make sure we get valid package name or fail. bug:22492225 Change-Id: I7b7dce9a8e398c4615bcb700de80241e94c4320c --- .../java/android/os/storage/StorageManager.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 2b75f31384f9b..b2cec60c04125 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -860,8 +860,23 @@ public class StorageManager { final IMountService mountService = IMountService.Stub.asInterface( ServiceManager.getService("mount")); try { - final String packageName = ActivityThread.currentOpPackageName(); + String packageName = ActivityThread.currentOpPackageName(); + if (packageName == null) { + // Package name can be null if the activity thread is running but the app + // hasn't bound yet. In this case we fall back to the first package in the + // current UID. This works for runtime permissions as permission state is + // per UID and permission realted app ops are updated for all UID packages. + String[] packageNames = ActivityThread.getPackageManager().getPackagesForUid( + android.os.Process.myUid()); + if (packageNames == null || packageNames.length <= 0) { + return new StorageVolume[0]; + } + packageName = packageNames[0]; + } final int uid = ActivityThread.getPackageManager().getPackageUid(packageName, userId); + if (uid <= 0) { + return new StorageVolume[0]; + } return mountService.getVolumeList(uid, packageName); } catch (RemoteException e) { throw e.rethrowAsRuntimeException();