From 4428e22d67e626eaa575098f334d71a60debdf3b Mon Sep 17 00:00:00 2001 From: Ruslan Tkhakokhov Date: Wed, 18 Aug 2021 07:22:40 +0100 Subject: [PATCH] Dispose of TransportClient in BMS#beginRestoreSession Currently we create a new transport client in UserBackupManagerService#beginRestoreSession but don't dispose of it properly which leaves us bound to the transport service. The client can eventually be garbage collected triggering the finalize() method which will unbind the transport but there're no guarantees as to whne it will happen. Explicitly dispose of the transport client like it's done in other places in the code. Bug: 196377372 Test: 1. Manual: 1.1. Run restore for any package via 'adb shell bmgr' 1.2. Check logcat for TransportClientManager to make sure the transport client created in beginRestoreSession() has been cleaned up. Change-Id: I9304768330ab796fccf67b544766d87461d977d7 --- .../server/backup/UserBackupManagerService.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index 9ee0159e903a1..0b95fefec1038 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -4068,14 +4068,20 @@ public class UserBackupManagerService { } int operationType; + TransportClient transportClient = null; try { - operationType = getOperationTypeFromTransport( - mTransportManager.getTransportClientOrThrow(transport, /* caller */ - "BMS.beginRestoreSession")); + transportClient = mTransportManager.getTransportClientOrThrow( + transport, /* caller */"BMS.beginRestoreSession"); + operationType = getOperationTypeFromTransport(transportClient); } catch (TransportNotAvailableException | TransportNotRegisteredException | RemoteException e) { Slog.w(TAG, "Failed to get operation type from transport: " + e); return null; + } finally { + if (transportClient != null) { + mTransportManager.disposeOfTransportClient(transportClient, + /* caller */"BMS.beginRestoreSession"); + } } synchronized (this) {