Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4a4a8c40 authored by Takamasa Kuramitsu's avatar Takamasa Kuramitsu
Browse files

Fix crash when loading roots from invalid provider

Files app crashes when loading roots from DocumentProvider with
invalid manifest definition.

Bug: 71884929
Test: Manual
Test: Run instrumentation tests from com.android.documentsui.tests
Change-Id: I330b59d1bb1c4c15d97fe4f2835d80ffc2ab1798
parent b2bd56d6
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -240,10 +240,27 @@ public class ProvidersCache implements ProvidersAccess {
            ContentResolver resolver, String authority, boolean forceRefresh) {
        if (VERBOSE) Log.v(TAG, "Loading roots for " + authority);

        synchronized (mObservedAuthoritiesDetails) {
            if (!mObservedAuthoritiesDetails.containsKey(authority)) {
        final ArrayList<RootInfo> roots = new ArrayList<>();
        ProviderInfo provider = mContext.getPackageManager().resolveContentProvider(
                authority, PackageManager.GET_META_DATA);
        if (!provider.exported) {
            Log.w(TAG, "Provider is not exported. Failed to load roots for " + authority);
            return roots;
        }
        if (!provider.grantUriPermissions) {
            Log.w(TAG, "Provider doesn't grantUriPermissions. Failed to load roots for "
                    + authority);
            return roots;
        }
        if (!android.Manifest.permission.MANAGE_DOCUMENTS.equals(provider.readPermission)
                || !android.Manifest.permission.MANAGE_DOCUMENTS.equals(provider.writePermission)) {
            Log.w(TAG, "Provider is not protected by MANAGE_DOCUMENTS. Failed to load roots for "
                    + authority);
            return roots;
        }

        synchronized (mObservedAuthoritiesDetails) {
            if (!mObservedAuthoritiesDetails.containsKey(authority)) {
                PackageManager pm = mContext.getPackageManager();
                CharSequence appName = pm.getApplicationLabel(provider.applicationInfo);
                String packageName = provider.applicationInfo.packageName;
@@ -274,7 +291,6 @@ public class ProvidersCache implements ProvidersAccess {
            }
        }

        final ArrayList<RootInfo> roots = new ArrayList<>();
        ContentProviderClient client = null;
        Cursor cursor = null;
        try {