Ensure TetheringService binder is alive after system_server crash

servicemanager does not restart on a system_server crash, so
mConnectorSupplier might temporarily return a stale version of
TetheringService. Any operation on the stale binder causes a
DeadObjectException.

This change adds a check to ensure the binder is alive before use
and falls back to polling servicemanager.

Bug: 353920381
Bug: 271276384
Change-Id: I549d5a07966ebaed7e4a4ebe96e831dcac3b05bd
Signed-off-by: charid <dhoddeti.brahmachari@oppo.com>
This commit is contained in:
charid 2024-07-23 17:46:11 +05:30 • committed by Patrick Rohr
commit d236106983

View file

@ -321,7 +321,9 @@ public class TetheringManager {
// up and be sent from a worker thread; later, they are always sent from the caller thread.
// Considering that it's just oneway binder calls, and ordering is preserved, this seems
// better than inconsistent behavior persisting after boot.
if (connector != null) {
// If system server restarted, mConnectorSupplier might temporarily return a stale (i.e.
// dead) version of TetheringService.
if (connector != null && connector.isBinderAlive()) {
mConnector = ITetheringConnector.Stub.asInterface(connector);
} else {
startPollingForConnector();
@ -356,9 +358,8 @@ public class TetheringManager {
} catch (InterruptedException e) {
// Not much to do here, the system needs to wait for the connector
}
final IBinder connector = mConnectorSupplier.get();
if (connector != null) {
if (connector != null && connector.isBinderAlive()) {
onTetheringConnected(ITetheringConnector.Stub.asInterface(connector));
return;
}