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 Original-Change: https://android-review.googlesource.com/1969041 Change-Id: Ibfe82fb187b7989164e22919a72b8c36d2655902 Merged-In: Ibfe82fb187b7989164e22919a72b8c36d2655902
This commit is contained in:
@@ -567,7 +567,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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -576,8 +582,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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1250,13 +1261,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(
|
||||
() ->
|
||||
cbInfo.mCallback.onGatewayConnectionError(
|
||||
gatewayConnectionName,
|
||||
errorCode,
|
||||
exceptionClass,
|
||||
exceptionMessage));
|
||||
Binder.withCleanCallingIdentity(() -> {
|
||||
try {
|
||||
cbInfo.mCallback.onGatewayConnectionError(
|
||||
gatewayConnectionName,
|
||||
errorCode,
|
||||
exceptionClass,
|
||||
exceptionMessage);
|
||||
} catch (RemoteException e) {
|
||||
logDbg("VcnStatusCallback threw on VCN status change", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user