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

Commit c5cbdb77 authored by William Escande's avatar William Escande
Browse files

binders: no race condition on getService/cleanup

Bug: 328841948
Fix: 328841948
Test: None
Flag: Exempt refactor
Change-Id: I4d827a209b9ed1997783dafb3758ad5c2749f461
parent 624f00b4
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -1378,18 +1378,19 @@ public class A2dpService extends ProfileService {

        @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
        private A2dpService getService(AttributionSource source) {
            // Cache mService because it can change while getService is called
            A2dpService service = mService;

            if (Utils.isInstrumentationTestMode()) {
                return mService;
                return service;
            }
            A2dpService currService = mService;

            if (currService == null
                    || !Utils.checkServiceAvailable(currService, TAG)
                    || !Utils.checkCallerIsSystemOrActiveOrManagedUser(currService, TAG)
                    || !Utils.checkConnectPermissionForDataDelivery(currService, source, TAG)) {
            if (!Utils.checkServiceAvailable(service, TAG)
                    || !Utils.checkCallerIsSystemOrActiveOrManagedUser(service, TAG)
                    || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) {
                return null;
            }
            return currService;
            return service;
        }

        BluetoothA2dpBinder(A2dpService svc) {
+18 −13
Original line number Diff line number Diff line
@@ -195,19 +195,6 @@ public class A2dpSinkService extends ProfileService {
            implements IProfileServiceBinder {
        private A2dpSinkService mService;

        @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
        private A2dpSinkService getService(AttributionSource source) {
            if (Utils.isInstrumentationTestMode()) {
                return mService;
            }
            if (!Utils.checkServiceAvailable(mService, TAG)
                    || !Utils.checkCallerIsSystemOrActiveOrManagedUser(mService, TAG)
                    || !Utils.checkConnectPermissionForDataDelivery(mService, source, TAG)) {
                return null;
            }
            return mService;
        }

        A2dpSinkServiceBinder(A2dpSinkService svc) {
            mService = svc;
        }
@@ -217,6 +204,24 @@ public class A2dpSinkService extends ProfileService {
            mService = null;
        }

        @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
        private A2dpSinkService getService(AttributionSource source) {
            // Cache mService because it can change while getService is called
            A2dpSinkService service = mService;

            if (Utils.isInstrumentationTestMode()) {
                return service;
            }

            if (!Utils.checkServiceAvailable(service, TAG)
                    || !Utils.checkCallerIsSystemOrActiveOrManagedUser(service, TAG)
                    || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) {
                return null;
            }

            return service;
        }

        @Override
        public boolean connect(BluetoothDevice device, AttributionSource source) {
            A2dpSinkService service = getService(source);
+18 −13
Original line number Diff line number Diff line
@@ -371,19 +371,6 @@ public class AvrcpControllerService extends ProfileService {
            implements IProfileServiceBinder {
        private AvrcpControllerService mService;

        @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
        private AvrcpControllerService getService(AttributionSource source) {
            if (Utils.isInstrumentationTestMode()) {
                return mService;
            }
            if (!Utils.checkServiceAvailable(mService, TAG)
                    || !Utils.checkCallerIsSystemOrActiveOrManagedUser(mService, TAG)
                    || !Utils.checkConnectPermissionForDataDelivery(mService, source, TAG)) {
                return null;
            }
            return mService;
        }

        AvrcpControllerServiceBinder(AvrcpControllerService service) {
            mService = service;
        }
@@ -393,6 +380,24 @@ public class AvrcpControllerService extends ProfileService {
            mService = null;
        }

        @RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
        private AvrcpControllerService getService(AttributionSource source) {
            // Cache mService because it can change while getService is called
            AvrcpControllerService service = mService;

            if (Utils.isInstrumentationTestMode()) {
                return service;
            }

            if (!Utils.checkServiceAvailable(service, TAG)
                    || !Utils.checkCallerIsSystemOrActiveOrManagedUser(service, TAG)
                    || !Utils.checkConnectPermissionForDataDelivery(service, source, TAG)) {
                return null;
            }

            return service;
        }

        @Override
        public List<BluetoothDevice> getConnectedDevices(AttributionSource source) {
            AvrcpControllerService service = getService(source);
+6 −3
Original line number Diff line number Diff line
@@ -2305,11 +2305,14 @@ public class AdapterService extends Service {
        }

        public AdapterService getService() {
            if (mService != null && mService.isAvailable()) {
                return mService;
            }
            // Cache mService because it can change while getService is called
            AdapterService service = mService;

            if (service == null || !service.isAvailable()) {
                return null;
            }
            return service;
        }

        @Override
        public int getState() {
+15 −12
Original line number Diff line number Diff line
@@ -1039,18 +1039,6 @@ public class CsipSetCoordinatorService extends ProfileService {
            implements IProfileServiceBinder {
        private CsipSetCoordinatorService mService;

        private CsipSetCoordinatorService getService() {
            if (Utils.isInstrumentationTestMode()) {
                return mService;
            }
            if (!Utils.checkServiceAvailable(mService, TAG)
                    || !Utils.checkCallerIsSystemOrActiveOrManagedUser(mService, TAG)) {
                return null;
            }

            return mService;
        }

        BluetoothCsisBinder(CsipSetCoordinatorService svc) {
            mService = svc;
        }
@@ -1060,6 +1048,21 @@ public class CsipSetCoordinatorService extends ProfileService {
            mService = null;
        }

        private CsipSetCoordinatorService getService() {
            // Cache mService because it can change while getService is called
            CsipSetCoordinatorService service = mService;

            if (Utils.isInstrumentationTestMode()) {
                return service;
            }
            if (!Utils.checkServiceAvailable(service, TAG)
                    || !Utils.checkCallerIsSystemOrActiveOrManagedUser(service, TAG)) {
                return null;
            }

            return service;
        }

        @Override
        public boolean connect(BluetoothDevice device, AttributionSource source) {
            Objects.requireNonNull(device, "device cannot be null");
Loading