Skip to content

Commit c50f31d

Browse files
committed
Check READ_EXTERNAL enforcement outside of lock.
Since SettingsProvider can call back into PMS, query the default enforcement state before acquiring mPackages lock. Bug: 7182437 Change-Id: Ie218aedfc7a943e5b221814af3e0356c7199b0e4
1 parent 6d51571 commit c50f31d

File tree

1 file changed

+28
-8
lines changed

1 file changed

+28
-8
lines changed

services/java/com/android/server/pm/PackageManagerService.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1715,6 +1715,7 @@ public int getPackageUid(String packageName, int userId) {
17151715
}
17161716

17171717
public int[] getPackageGids(String packageName) {
1718+
final boolean enforcedDefault = isPermissionEnforcedDefault(READ_EXTERNAL_STORAGE);
17181719
// reader
17191720
synchronized (mPackages) {
17201721
PackageParser.Package p = mPackages.get(packageName);
@@ -1726,7 +1727,7 @@ public int[] getPackageGids(String packageName) {
17261727
int[] gids = suid != null ? suid.gids : ps.gids;
17271728

17281729
// include GIDs for any unenforced permissions
1729-
if (!isPermissionEnforcedLocked(READ_EXTERNAL_STORAGE)) {
1730+
if (!isPermissionEnforcedLocked(READ_EXTERNAL_STORAGE, enforcedDefault)) {
17301731
final BasePermission basePerm = mSettings.mPermissions.get(
17311732
READ_EXTERNAL_STORAGE);
17321733
gids = appendInts(gids, basePerm.gids);
@@ -2054,6 +2055,7 @@ private void checkValidCaller(int uid, int userId) {
20542055
}
20552056

20562057
public int checkPermission(String permName, String pkgName) {
2058+
final boolean enforcedDefault = isPermissionEnforcedDefault(permName);
20572059
synchronized (mPackages) {
20582060
PackageParser.Package p = mPackages.get(pkgName);
20592061
if (p != null && p.mExtras != null) {
@@ -2066,14 +2068,15 @@ public int checkPermission(String permName, String pkgName) {
20662068
return PackageManager.PERMISSION_GRANTED;
20672069
}
20682070
}
2069-
if (!isPermissionEnforcedLocked(permName)) {
2071+
if (!isPermissionEnforcedLocked(permName, enforcedDefault)) {
20702072
return PackageManager.PERMISSION_GRANTED;
20712073
}
20722074
}
20732075
return PackageManager.PERMISSION_DENIED;
20742076
}
20752077

20762078
public int checkUidPermission(String permName, int uid) {
2079+
final boolean enforcedDefault = isPermissionEnforcedDefault(permName);
20772080
synchronized (mPackages) {
20782081
Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid));
20792082
if (obj != null) {
@@ -2087,7 +2090,7 @@ public int checkUidPermission(String permName, int uid) {
20872090
return PackageManager.PERMISSION_GRANTED;
20882091
}
20892092
}
2090-
if (!isPermissionEnforcedLocked(permName)) {
2093+
if (!isPermissionEnforcedLocked(permName, enforcedDefault)) {
20912094
return PackageManager.PERMISSION_GRANTED;
20922095
}
20932096
}
@@ -10124,19 +10127,36 @@ public void setPermissionEnforced(String permission, boolean enforced) {
1012410127

1012510128
@Override
1012610129
public boolean isPermissionEnforced(String permission) {
10130+
final boolean enforcedDefault = isPermissionEnforcedDefault(permission);
1012710131
synchronized (mPackages) {
10128-
return isPermissionEnforcedLocked(permission);
10132+
return isPermissionEnforcedLocked(permission, enforcedDefault);
1012910133
}
1013010134
}
1013110135

10132-
private boolean isPermissionEnforcedLocked(String permission) {
10136+
/**
10137+
* Check if given permission should be enforced by default. Should always be
10138+
* called outside of {@link #mPackages} lock.
10139+
*/
10140+
private boolean isPermissionEnforcedDefault(String permission) {
10141+
if (READ_EXTERNAL_STORAGE.equals(permission)) {
10142+
return Secure.getInt(mContext.getContentResolver(),
10143+
Secure.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT, 0) != 0;
10144+
} else {
10145+
return true;
10146+
}
10147+
}
10148+
10149+
/**
10150+
* Check if user has requested that given permission be enforced, using
10151+
* given default if undefined.
10152+
*/
10153+
private boolean isPermissionEnforcedLocked(String permission, boolean enforcedDefault) {
1013310154
if (READ_EXTERNAL_STORAGE.equals(permission)) {
1013410155
if (mSettings.mReadExternalStorageEnforced != null) {
1013510156
return mSettings.mReadExternalStorageEnforced;
1013610157
} else {
10137-
// if user hasn't defined, fall back to secure default
10138-
return Secure.getInt(mContext.getContentResolver(),
10139-
Secure.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT, 0) != 0;
10158+
// User hasn't defined; fall back to secure default
10159+
return enforcedDefault;
1014010160
}
1014110161
} else {
1014210162
return true;

0 commit comments

Comments
 (0)