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

Commit 3e737ad1 authored by Song Chun Fan's avatar Song Chun Fan
Browse files

[SettingsProvider] add NPE check for acquireProvider

In rare cases, SettingsProvider cannot be found. For example, when a user is being deleted. In such cases, we should still prevent the caller from crashing by adding a null check for the result of acquireProvider.

BUG: 401857515
FIXES: 401857515
Test: presubmit
FLAG: EXEMPT bug fix
Change-Id: I9b233a9cdaff77e970ae5ae9bb46ee16c1d4054c
parent 31ebd6c2
Loading
Loading
Loading
Loading
+62 −0
Original line number Diff line number Diff line
@@ -3553,6 +3553,10 @@ public final class Settings {
                    arg.putBoolean(CALL_METHOD_OVERRIDEABLE_BY_RESTORE_KEY, true);
                }
                IContentProvider cp = mProviderHolder.getProvider(cr);
                if (cp == null) {
                    Log.w(TAG, "Can't set key " + name + " in " + mUri + " because cp is null");
                    return false;
                }
                cp.call(cr.getAttributionSource(),
                        mProviderHolder.mUri.getAuthority(), mCallSetCommand, name, arg);
            } catch (RemoteException e) {
@@ -3573,6 +3577,10 @@ public final class Settings {
                args.putString(CALL_METHOD_PREFIX_KEY, prefix);
                args.putSerializable(CALL_METHOD_FLAGS_KEY, keyValues);
                IContentProvider cp = mProviderHolder.getProvider(cr);
                if (cp == null) {
                    Log.w(TAG, "Can't set strings for prefix " + prefix + " because cp is null");
                    return SET_ALL_RESULT_FAILURE;
                }
                Bundle bundle = cp.call(cr.getAttributionSource(),
                        mProviderHolder.mUri.getAuthority(),
                        mCallSetAllCommand, null, args);
@@ -3588,6 +3596,10 @@ public final class Settings {
                Bundle arg = new Bundle();
                arg.putInt(CALL_METHOD_USER_KEY, userHandle);
                IContentProvider cp = mProviderHolder.getProvider(cr);
                if (cp == null) {
                    Log.w(TAG, "Can't delete key " + name + " because cp is null");
                    return false;
                }
                cp.call(cr.getAttributionSource(),
                        mProviderHolder.mUri.getAuthority(), mCallDeleteCommand, name, arg);
            } catch (RemoteException e) {
@@ -3673,6 +3685,10 @@ public final class Settings {
            }
            IContentProvider cp = mProviderHolder.getProvider(cr);
            if (cp == null) {
                Log.w(TAG, "Can't get key " + name + " because cp is null");
                return null;  // Return null, but don't cache it.
            }
            // Try the fast path first, not using query().  If this
            // fails (alternate Settings provider that doesn't support
@@ -3887,6 +3903,10 @@ public final class Settings {
                Log.i(TAG, "Cache miss for prefix:" + prefix);
            }
            IContentProvider cp = mProviderHolder.getProvider(cr);
            if (cp == null) {
                Log.w(TAG, "Can't get strings for prefix " + prefix + " because cp is null");
                return keyValues;
            }
            try {
                Bundle args = new Bundle();
@@ -4459,6 +4479,11 @@ public final class Settings {
                }
                arg.putInt(CALL_METHOD_RESET_MODE_KEY, mode);
                IContentProvider cp = sProviderHolder.getProvider(resolver);
                if (cp == null) {
                    Log.w(TAG, "Can't reset to defaults for " + CONTENT_URI
                        + " because cp is null");
                    return;
                }
                cp.call(resolver.getAttributionSource(),
                        sProviderHolder.mUri.getAuthority(), CALL_METHOD_RESET_SYSTEM, null, arg);
            } catch (RemoteException e) {
@@ -7372,6 +7397,11 @@ public final class Settings {
                }
                arg.putInt(CALL_METHOD_RESET_MODE_KEY, mode);
                IContentProvider cp = sProviderHolder.getProvider(resolver);
                if (cp == null) {
                    Log.w(TAG, "Can't reset to defaults for " + CONTENT_URI
                        + " because cp is null");
                    return;
                }
                cp.call(resolver.getAttributionSource(),
                        sProviderHolder.mUri.getAuthority(), CALL_METHOD_RESET_SECURE, null, arg);
            } catch (RemoteException e) {
@@ -18834,6 +18864,11 @@ public final class Settings {
                }
                arg.putInt(CALL_METHOD_RESET_MODE_KEY, mode);
                IContentProvider cp = sProviderHolder.getProvider(resolver);
                if (cp == null) {
                    Log.w(TAG, "Can't reset to defaults for " + CONTENT_URI
                        + " because cp is null");
                    return;
                }
                cp.call(resolver.getAttributionSource(),
                        sProviderHolder.mUri.getAuthority(), CALL_METHOD_RESET_GLOBAL, null, arg);
            } catch (RemoteException e) {
@@ -21084,6 +21119,10 @@ public final class Settings {
                Bundle arg = new Bundle();
                arg.putInt(Settings.CALL_METHOD_USER_KEY, resolver.getUserId());
                IContentProvider cp = sProviderHolder.getProvider(resolver);
                if (cp == null) {
                    Log.w(TAG, "Can't get all strings because cp is null");
                    return allFlags;
                }
                if (Flags.reduceBinderTransactionSizeForGetAllProperties()) {
                    Bundle b = cp.call(resolver.getAttributionSource(),
@@ -21261,6 +21300,11 @@ public final class Settings {
                    arg.putString(Settings.CALL_METHOD_PREFIX_KEY, createPrefix(namespace));
                }
                IContentProvider cp = sProviderHolder.getProvider(resolver);
                if (cp == null) {
                    Log.w(TAG, "Can't reset to defaults for " + CONTENT_URI
                        + " because cp is null");
                    return;
                }
                cp.call(resolver.getAttributionSource(),
                        sProviderHolder.mUri.getAuthority(), CALL_METHOD_RESET_CONFIG, null, arg);
            } catch (RemoteException e) {
@@ -21283,6 +21327,11 @@ public final class Settings {
                Bundle args = new Bundle();
                args.putInt(CALL_METHOD_SYNC_DISABLED_MODE_KEY, disableSyncMode);
                IContentProvider cp = sProviderHolder.getProvider(resolver);
                if (cp == null) {
                    Log.w(TAG, "Can't set sync disabled mode for " + CONTENT_URI
                        + " because cp is null");
                    return;
                }
                cp.call(resolver.getAttributionSource(), sProviderHolder.mUri.getAuthority(),
                        CALL_METHOD_SET_SYNC_DISABLED_MODE_CONFIG, null, args);
            } catch (RemoteException e) {
@@ -21304,6 +21353,11 @@ public final class Settings {
                ContentResolver resolver = getContentResolver();
                Bundle args = Bundle.EMPTY;
                IContentProvider cp = sProviderHolder.getProvider(resolver);
                if (cp == null) {
                    Log.w(TAG, "Can't query sync disabled mode for " + CONTENT_URI
                        + " because cp is null");
                    return -1;
                }
                Bundle bundle = cp.call(resolver.getAttributionSource(),
                        sProviderHolder.mUri.getAuthority(),
                        CALL_METHOD_GET_SYNC_DISABLED_MODE_CONFIG,
@@ -21345,6 +21399,10 @@ public final class Settings {
                Bundle arg = new Bundle();
                arg.putInt(CALL_METHOD_USER_KEY, resolver.getUserId());
                IContentProvider cp = sProviderHolder.getProvider(resolver);
                if (cp == null) {
                    Log.w(TAG, "Can't clear config monitor callback because cp is null");
                    return;
                }
                cp.call(resolver.getAttributionSource(),
                        sProviderHolder.mUri.getAuthority(),
                        CALL_METHOD_UNREGISTER_MONITOR_CALLBACK_CONFIG, null, arg);
@@ -21416,6 +21474,10 @@ public final class Settings {
                            handleMonitorCallback(result, executor, callback);
                        }));
                IContentProvider cp = sProviderHolder.getProvider(resolver);
                if (cp == null) {
                    Log.w(TAG, "Can't set config monitor callback because cp is null");
                    return;
                }
                cp.call(resolver.getAttributionSource(),
                        sProviderHolder.mUri.getAuthority(),
                        CALL_METHOD_REGISTER_MONITOR_CALLBACK_CONFIG, null, arg);