Ensure location provider exceptions are visible

Exceptions thrown on one-way binder threads are dropped and ignored,
which is very harmful to writing stable code. Rethrow any exceptions
from these binder calls on the main thread to crash the process.

Test: presubmits
Change-Id: Ie5986061c6d664f59b83679c90dd07adad1a7ec2
This commit is contained in:
Soonil Nagarkar
2022-01-10 12:14:34 -08:00
parent 6f01f95a53
commit a25ac6d49b

View File

@@ -26,7 +26,9 @@ import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;
@@ -308,9 +310,7 @@ public abstract class LocationProviderBase {
synchronized (mBinder) {
try {
manager.onInitialize(mAllowed, mProperties, mAttributionTag);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (RuntimeException e) {
} catch (RemoteException | RuntimeException e) {
Log.w(mTag, e);
}
@@ -320,12 +320,28 @@ public abstract class LocationProviderBase {
@Override
public void setRequest(ProviderRequest request) {
onSetRequest(request);
try {
onSetRequest(request);
} catch (RuntimeException e) {
// exceptions on one-way binder threads are dropped - move to a different thread
Log.w(mTag, e);
new Handler(Looper.getMainLooper()).post(() -> {
throw new AssertionError(e);
});
}
}
@Override
public void flush() {
onFlush(this::onFlushComplete);
try {
onFlush(this::onFlushComplete);
} catch (RuntimeException e) {
// exceptions on one-way binder threads are dropped - move to a different thread
Log.w(mTag, e);
new Handler(Looper.getMainLooper()).post(() -> {
throw new AssertionError(e);
});
}
}
private void onFlushComplete() {
@@ -333,9 +349,7 @@ public abstract class LocationProviderBase {
if (manager != null) {
try {
manager.onFlushComplete();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (RuntimeException e) {
} catch (RemoteException | RuntimeException e) {
Log.w(mTag, e);
}
}
@@ -343,7 +357,15 @@ public abstract class LocationProviderBase {
@Override
public void sendExtraCommand(String command, Bundle extras) {
onSendExtraCommand(command, extras);
try {
onSendExtraCommand(command, extras);
} catch (RuntimeException e) {
// exceptions on one-way binder threads are dropped - move to a different thread
Log.w(mTag, e);
new Handler(Looper.getMainLooper()).post(() -> {
throw new AssertionError(e);
});
}
}
}
}