diff options
| -rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 6128d45831fb..55f48e3e367f 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -2089,7 +2089,33 @@ public class SettingsProvider extends ContentProvider { // setting. return false; } - final String mimeType = getContext().getContentResolver().getType(audioUri); + + // If the audioUri comes from FileProvider, the security check will fail. Currently, it + // should not have too many FileProvider Uri usage, using a workaround fix here. + // Only allow for caller is privileged apps + ApplicationInfo aInfo = null; + try { + aInfo = getCallingApplicationInfoOrThrow(); + } catch (IllegalStateException ignored) { + Slog.w(LOG_TAG, "isValidMediaUri: cannot get calling app info for setting: " + + name + " URI: " + audioUri); + return false; + } + final boolean isPrivilegedApp = aInfo != null ? aInfo.isPrivilegedApp() : false; + String mimeType = null; + if (isPrivilegedApp) { + final long identity = Binder.clearCallingIdentity(); + try { + mimeType = getContext().getContentResolver().getType(audioUri); + } finally { + Binder.restoreCallingIdentity(identity); + } + } else { + mimeType = getContext().getContentResolver().getType(audioUri); + } + if (DEBUG) { + Slog.v(LOG_TAG, "isValidMediaUri mimeType: " + mimeType); + } if (mimeType == null) { Slog.e(LOG_TAG, "mutateSystemSetting for setting: " + name + " URI: " + audioUri |