diff options
| author | 2019-01-04 08:10:41 -0800 | |
|---|---|---|
| committer | 2019-01-04 08:10:41 -0800 | |
| commit | 7b1c6cda12c7d687cef7c87f1031325e118214c3 (patch) | |
| tree | afb01d6dd55e5a87202a3bddadc3cb06456f4577 | |
| parent | 12278ded88e74db09a1624bd49cff322df33b88c (diff) | |
Update DeviceConfigService to pass Settings.AUTHORITY to IContentProvider.call invocations.
Also update SettingsProvider to resolve calling packages based on uids
when receiving calls to put or reset values in the config table. This
was necessary because the command line tool calls the DeviceConfig API,
which calls through to SettingsProvider. That was resulting in a
shell uid with an android package prior to this change.
Test: atest SettingsProviderTest:DeviceConfigServiceTest
Bug: 122304633
Change-Id: Ic80c734eb75dcaac688507c241b0995b7488a84f
3 files changed, 21 insertions, 6 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 65514b6f1872..81bc36506824 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -14070,11 +14070,10 @@ public final class Settings { try { Bundle arg = new Bundle(); arg.putInt(CALL_METHOD_USER_KEY, resolver.getUserId()); - arg.putInt(Settings.CALL_METHOD_RESET_MODE_KEY, resetMode); + arg.putInt(CALL_METHOD_RESET_MODE_KEY, resetMode); if (prefix != null) { arg.putString(Settings.CALL_METHOD_PREFIX_KEY, prefix); } - arg.putInt(CALL_METHOD_RESET_MODE_KEY, resetMode); IContentProvider cp = sProviderHolder.getProvider(resolver); cp.call(resolver.getPackageName(), sProviderHolder.mUri.getAuthority(), CALL_METHOD_RESET_CONFIG, null, arg); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java b/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java index f2b2719f2ee6..d0ffe7ae8c7e 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java @@ -242,7 +242,7 @@ public final class DeviceConfigService extends Binder { Bundle args = new Bundle(); args.putInt(Settings.CALL_METHOD_USER_KEY, ActivityManager.getService().getCurrentUser().id); - Bundle b = provider.call(resolveCallingPackage(), + Bundle b = provider.call(resolveCallingPackage(), Settings.AUTHORITY, Settings.CALL_METHOD_DELETE_CONFIG, compositeKey, args); success = (b != null && b.getInt(SettingsProvider.RESULT_ROWS_DELETED) == 1); } catch (RemoteException e) { @@ -261,7 +261,7 @@ public final class DeviceConfigService extends Binder { if (namespace != null) { args.putString(Settings.CALL_METHOD_PREFIX_KEY, namespace); } - Bundle b = provider.call(resolveCallingPackage(), + Bundle b = provider.call(resolveCallingPackage(), Settings.AUTHORITY, Settings.CALL_METHOD_LIST_CONFIG, null, args); if (b != null) { Map<String, String> flagsToValues = diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index ce529a085e77..19ce2803fd60 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -1097,7 +1097,7 @@ public class SettingsProvider extends ContentProvider { case MUTATION_OPERATION_INSERT: { return mSettingsRegistry.insertSettingLocked(SETTINGS_TYPE_CONFIG, UserHandle.USER_SYSTEM, name, value, null, makeDefault, true, - getCallingPackage(), false, null); + resolveCallingPackage(), false, null); } case MUTATION_OPERATION_DELETE: { @@ -1107,7 +1107,7 @@ public class SettingsProvider extends ContentProvider { case MUTATION_OPERATION_RESET: { mSettingsRegistry.resetSettingsLocked(SETTINGS_TYPE_CONFIG, - UserHandle.USER_SYSTEM, getCallingPackage(), mode, null, prefix); + UserHandle.USER_SYSTEM, resolveCallingPackage(), mode, null, prefix); } return true; } } @@ -2247,6 +2247,22 @@ public class SettingsProvider extends ContentProvider { return !(TextUtils.isEmpty(key) || SettingsState.isBinary(key)); } + private String resolveCallingPackage() { + switch (Binder.getCallingUid()) { + case Process.ROOT_UID: { + return "root"; + } + + case Process.SHELL_UID: { + return "com.android.shell"; + } + + default: { + return getCallingPackage(); + } + } + } + private static final class Arguments { private static final Pattern WHERE_PATTERN_WITH_PARAM_NO_BRACKETS = Pattern.compile("[\\s]*name[\\s]*=[\\s]*\\?[\\s]*"); |