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

Commit 5a7e3797 authored by Benedict Wong's avatar Benedict Wong
Browse files

Fix potential for dead binders when calling callbacks

This patch ensures that all callbacks out of the VcnManagementService
are try/catch guarded to ensure that callbacks are not called and throw
an exception.

This is triggered when telephony dies, which results in the
subscriptions changing, and attempting to notify the policy listeners
triggers a DeadObjectException.

Bug: 217537578
Test: atest FrameworksVcnTests
Change-Id: Ibfe82fb187b7989164e22919a72b8c36d2655902
parent 86e1a45b
Loading
Loading
Loading
Loading
+25 −10
Original line number Diff line number Diff line
@@ -539,7 +539,13 @@ public class VcnManagementService extends IVcnManagementService.Stub {
    @GuardedBy("mLock")
    private void notifyAllPolicyListenersLocked() {
        for (final PolicyListenerBinderDeath policyListener : mRegisteredPolicyListeners.values()) {
            Binder.withCleanCallingIdentity(() -> policyListener.mListener.onPolicyChanged());
            Binder.withCleanCallingIdentity(() -> {
                try {
                    policyListener.mListener.onPolicyChanged();
                } catch (RemoteException e) {
                    logDbg("VcnStatusCallback threw on VCN status change", e);
                }
            });
        }
    }

@@ -548,8 +554,13 @@ public class VcnManagementService extends IVcnManagementService.Stub {
            @NonNull ParcelUuid subGroup, @VcnStatusCode int statusCode) {
        for (final VcnStatusCallbackInfo cbInfo : mRegisteredStatusCallbacks.values()) {
            if (isCallbackPermissioned(cbInfo, subGroup)) {
                Binder.withCleanCallingIdentity(
                        () -> cbInfo.mCallback.onVcnStatusChanged(statusCode));
                Binder.withCleanCallingIdentity(() -> {
                    try {
                        cbInfo.mCallback.onVcnStatusChanged(statusCode);
                    } catch (RemoteException e) {
                        logDbg("VcnStatusCallback threw on VCN status change", e);
                    }
                });
            }
        }
    }
@@ -1222,13 +1233,17 @@ public class VcnManagementService extends IVcnManagementService.Stub {
                // Notify all registered StatusCallbacks for this subGroup
                for (VcnStatusCallbackInfo cbInfo : mRegisteredStatusCallbacks.values()) {
                    if (isCallbackPermissioned(cbInfo, mSubGroup)) {
                        Binder.withCleanCallingIdentity(
                                () ->
                        Binder.withCleanCallingIdentity(() -> {
                            try {
                                cbInfo.mCallback.onGatewayConnectionError(
                                        gatewayConnectionName,
                                        errorCode,
                                        exceptionClass,
                                                exceptionMessage));
                                        exceptionMessage);
                            } catch (RemoteException e) {
                                logDbg("VcnStatusCallback threw on VCN status change", e);
                            }
                        });
                    }
                }
            }