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

Commit a25ac6d4 authored by Soonil Nagarkar's avatar Soonil Nagarkar
Browse files

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
parent 6f01f95a
Loading
Loading
Loading
Loading
+31 −9
Original line number Diff line number Diff line
@@ -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) {
            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() {
            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) {
            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);
                });
            }
        }
    }
}