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

Commit 31cfa313 authored by Yu-Han Yang's avatar Yu-Han Yang
Browse files

Clear binder identity at native entry calls

Bug: 182099342
Fixes: 182099342
Test: on device
Change-Id: Ic38c21555065e07f6e78a8ba74c804a13922db37
parent 364576c7
Loading
Loading
Loading
Loading
+114 −80
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ import android.location.GnssMeasurementsEvent;
import android.location.GnssNavigationMessage;
import android.location.GnssNavigationMessage;
import android.location.GnssStatus;
import android.location.GnssStatus;
import android.location.Location;
import android.location.Location;
import android.os.Binder;
import android.os.SystemClock;
import android.os.SystemClock;
import android.util.Log;
import android.util.Log;


@@ -921,6 +922,7 @@ public class GnssNative {


    @NativeEntryPoint
    @NativeEntryPoint
    void reportGnssServiceDied() {
    void reportGnssServiceDied() {
        // Not necessary to clear (and restore) binder identity since it runs on another thread.
        Log.e(TAG, "gnss hal died - restarting shortly...");
        Log.e(TAG, "gnss hal died - restarting shortly...");


        // move to another thread just in case there is some awkward gnss thread dependency with
        // move to another thread just in case there is some awkward gnss thread dependency with
@@ -940,6 +942,7 @@ public class GnssNative {


    @NativeEntryPoint
    @NativeEntryPoint
    void reportLocation(boolean hasLatLong, Location location) {
    void reportLocation(boolean hasLatLong, Location location) {
        Binder.withCleanCallingIdentity(() -> {
            if (hasLatLong && !mHasFirstFix) {
            if (hasLatLong && !mHasFirstFix) {
                mHasFirstFix = true;
                mHasFirstFix = true;


@@ -967,33 +970,40 @@ public class GnssNative {
            for (int i = 0; i < mLocationCallbacks.length; i++) {
            for (int i = 0; i < mLocationCallbacks.length; i++) {
                mLocationCallbacks[i].onReportLocation(hasLatLong, location);
                mLocationCallbacks[i].onReportLocation(hasLatLong, location);
            }
            }
        });
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportStatus(@StatusCallbacks.GnssStatusValue int gnssStatus) {
    void reportStatus(@StatusCallbacks.GnssStatusValue int gnssStatus) {
        Binder.withCleanCallingIdentity(() -> {
            for (int i = 0; i < mStatusCallbacks.length; i++) {
            for (int i = 0; i < mStatusCallbacks.length; i++) {
                mStatusCallbacks[i].onReportStatus(gnssStatus);
                mStatusCallbacks[i].onReportStatus(gnssStatus);
            }
            }
        });
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportSvStatus(int svCount, int[] svidWithFlags, float[] cn0DbHzs,
    void reportSvStatus(int svCount, int[] svidWithFlags, float[] cn0DbHzs,
            float[] elevations, float[] azimuths, float[] carrierFrequencies,
            float[] elevations, float[] azimuths, float[] carrierFrequencies,
            float[] basebandCn0DbHzs) {
            float[] basebandCn0DbHzs) {
        Binder.withCleanCallingIdentity(() -> {
            GnssStatus gnssStatus = GnssStatus.wrap(svCount, svidWithFlags, cn0DbHzs, elevations,
            GnssStatus gnssStatus = GnssStatus.wrap(svCount, svidWithFlags, cn0DbHzs, elevations,
                    azimuths, carrierFrequencies, basebandCn0DbHzs);
                    azimuths, carrierFrequencies, basebandCn0DbHzs);
            for (int i = 0; i < mSvStatusCallbacks.length; i++) {
            for (int i = 0; i < mSvStatusCallbacks.length; i++) {
                mSvStatusCallbacks[i].onReportSvStatus(gnssStatus);
                mSvStatusCallbacks[i].onReportSvStatus(gnssStatus);
            }
            }
        });
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportAGpsStatus(int agpsType, int agpsStatus, byte[] suplIpAddr) {
    void reportAGpsStatus(int agpsType, int agpsStatus, byte[] suplIpAddr) {
        mAGpsCallbacks.onReportAGpsStatus(agpsType, agpsStatus, suplIpAddr);
        Binder.withCleanCallingIdentity(
                () -> mAGpsCallbacks.onReportAGpsStatus(agpsType, agpsStatus, suplIpAddr));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportNmea(long timestamp) {
    void reportNmea(long timestamp) {
        Binder.withCleanCallingIdentity(() -> {
            if (mItarSpeedLimitExceeded) {
            if (mItarSpeedLimitExceeded) {
                return;
                return;
            }
            }
@@ -1001,10 +1011,12 @@ public class GnssNative {
            for (int i = 0; i < mNmeaCallbacks.length; i++) {
            for (int i = 0; i < mNmeaCallbacks.length; i++) {
                mNmeaCallbacks[i].onReportNmea(timestamp);
                mNmeaCallbacks[i].onReportNmea(timestamp);
            }
            }
        });
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportMeasurementData(GnssMeasurementsEvent event) {
    void reportMeasurementData(GnssMeasurementsEvent event) {
        Binder.withCleanCallingIdentity(() -> {
            if (mItarSpeedLimitExceeded) {
            if (mItarSpeedLimitExceeded) {
                return;
                return;
            }
            }
@@ -1012,17 +1024,21 @@ public class GnssNative {
            for (int i = 0; i < mMeasurementCallbacks.length; i++) {
            for (int i = 0; i < mMeasurementCallbacks.length; i++) {
                mMeasurementCallbacks[i].onReportMeasurements(event);
                mMeasurementCallbacks[i].onReportMeasurements(event);
            }
            }
        });
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportAntennaInfo(List<GnssAntennaInfo> antennaInfos) {
    void reportAntennaInfo(List<GnssAntennaInfo> antennaInfos) {
        Binder.withCleanCallingIdentity(() -> {
            for (int i = 0; i < mAntennaInfoCallbacks.length; i++) {
            for (int i = 0; i < mAntennaInfoCallbacks.length; i++) {
                mAntennaInfoCallbacks[i].onReportAntennaInfo(antennaInfos);
                mAntennaInfoCallbacks[i].onReportAntennaInfo(antennaInfos);
            }
            }
        });
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportNavigationMessage(GnssNavigationMessage event) {
    void reportNavigationMessage(GnssNavigationMessage event) {
        Binder.withCleanCallingIdentity(() -> {
            if (mItarSpeedLimitExceeded) {
            if (mItarSpeedLimitExceeded) {
                return;
                return;
            }
            }
@@ -1030,6 +1046,7 @@ public class GnssNative {
            for (int i = 0; i < mNavigationMessageCallbacks.length; i++) {
            for (int i = 0; i < mNavigationMessageCallbacks.length; i++) {
                mNavigationMessageCallbacks[i].onReportNavigationMessage(event);
                mNavigationMessageCallbacks[i].onReportNavigationMessage(event);
            }
            }
        });
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
@@ -1061,6 +1078,7 @@ public class GnssNative {


    private void onCapabilitiesChanged(GnssCapabilities oldCapabilities,
    private void onCapabilitiesChanged(GnssCapabilities oldCapabilities,
            GnssCapabilities newCapabilities) {
            GnssCapabilities newCapabilities) {
        Binder.withCleanCallingIdentity(() -> {
            if (newCapabilities.equals(oldCapabilities)) {
            if (newCapabilities.equals(oldCapabilities)) {
                return;
                return;
            }
            }
@@ -1070,6 +1088,7 @@ public class GnssNative {
            for (int i = 0; i < mBaseCallbacks.length; i++) {
            for (int i = 0; i < mBaseCallbacks.length; i++) {
                mBaseCallbacks[i].onCapabilitiesChanged(oldCapabilities, newCapabilities);
                mBaseCallbacks[i].onCapabilitiesChanged(oldCapabilities, newCapabilities);
            }
            }
        });
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
@@ -1089,88 +1108,103 @@ public class GnssNative {


    @NativeEntryPoint
    @NativeEntryPoint
    void reportLocationBatch(Location[] locations) {
    void reportLocationBatch(Location[] locations) {
        Binder.withCleanCallingIdentity(() -> {
            for (int i = 0; i < mLocationCallbacks.length; i++) {
            for (int i = 0; i < mLocationCallbacks.length; i++) {
                mLocationCallbacks[i].onReportLocations(locations);
                mLocationCallbacks[i].onReportLocations(locations);
            }
            }
        });
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void psdsDownloadRequest(int psdsType) {
    void psdsDownloadRequest(int psdsType) {
        mPsdsCallbacks.onRequestPsdsDownload(psdsType);
        Binder.withCleanCallingIdentity(() -> mPsdsCallbacks.onRequestPsdsDownload(psdsType));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportGeofenceTransition(int geofenceId, Location location, int transition,
    void reportGeofenceTransition(int geofenceId, Location location, int transition,
            long transitionTimestamp) {
            long transitionTimestamp) {
        mGeofenceCallbacks.onReportGeofenceTransition(geofenceId, location, transition,
        Binder.withCleanCallingIdentity(
                transitionTimestamp);
                () -> mGeofenceCallbacks.onReportGeofenceTransition(geofenceId, location,
                        transition, transitionTimestamp));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportGeofenceStatus(int status, Location location) {
    void reportGeofenceStatus(int status, Location location) {
        mGeofenceCallbacks.onReportGeofenceStatus(status, location);
        Binder.withCleanCallingIdentity(
                () -> mGeofenceCallbacks.onReportGeofenceStatus(status, location));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportGeofenceAddStatus(int geofenceId, @GeofenceCallbacks.GeofenceStatus int status) {
    void reportGeofenceAddStatus(int geofenceId, @GeofenceCallbacks.GeofenceStatus int status) {
        mGeofenceCallbacks.onReportGeofenceAddStatus(geofenceId, status);
        Binder.withCleanCallingIdentity(
                () -> mGeofenceCallbacks.onReportGeofenceAddStatus(geofenceId, status));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportGeofenceRemoveStatus(int geofenceId, @GeofenceCallbacks.GeofenceStatus int status) {
    void reportGeofenceRemoveStatus(int geofenceId, @GeofenceCallbacks.GeofenceStatus int status) {
        mGeofenceCallbacks.onReportGeofenceRemoveStatus(geofenceId, status);
        Binder.withCleanCallingIdentity(
                () -> mGeofenceCallbacks.onReportGeofenceRemoveStatus(geofenceId, status));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportGeofencePauseStatus(int geofenceId, @GeofenceCallbacks.GeofenceStatus int status) {
    void reportGeofencePauseStatus(int geofenceId, @GeofenceCallbacks.GeofenceStatus int status) {
        mGeofenceCallbacks.onReportGeofencePauseStatus(geofenceId, status);
        Binder.withCleanCallingIdentity(
                () -> mGeofenceCallbacks.onReportGeofencePauseStatus(geofenceId, status));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportGeofenceResumeStatus(int geofenceId, @GeofenceCallbacks.GeofenceStatus int status) {
    void reportGeofenceResumeStatus(int geofenceId, @GeofenceCallbacks.GeofenceStatus int status) {
        mGeofenceCallbacks.onReportGeofenceResumeStatus(geofenceId, status);
        Binder.withCleanCallingIdentity(
                () -> mGeofenceCallbacks.onReportGeofenceResumeStatus(geofenceId, status));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportNiNotification(int notificationId, int niType, int notifyFlags,
    void reportNiNotification(int notificationId, int niType, int notifyFlags,
            int timeout, int defaultResponse, String requestorId, String text,
            int timeout, int defaultResponse, String requestorId, String text,
            int requestorIdEncoding, int textEncoding) {
            int requestorIdEncoding, int textEncoding) {
        mNotificationCallbacks.onReportNiNotification(notificationId, niType, notifyFlags, timeout,
        Binder.withCleanCallingIdentity(
                    defaultResponse, requestorId, text, requestorIdEncoding, textEncoding);
                () -> mNotificationCallbacks.onReportNiNotification(notificationId, niType,
                        notifyFlags, timeout, defaultResponse, requestorId, text,
                        requestorIdEncoding, textEncoding));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void requestSetID(int flags) {
    void requestSetID(int flags) {
        mAGpsCallbacks.onRequestSetID(flags);
        Binder.withCleanCallingIdentity(() -> mAGpsCallbacks.onRequestSetID(flags));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void requestLocation(boolean independentFromGnss, boolean isUserEmergency) {
    void requestLocation(boolean independentFromGnss, boolean isUserEmergency) {
        mLocationRequestCallbacks.onRequestLocation(independentFromGnss, isUserEmergency);
        Binder.withCleanCallingIdentity(
                () -> mLocationRequestCallbacks.onRequestLocation(independentFromGnss,
                        isUserEmergency));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void requestUtcTime() {
    void requestUtcTime() {
        mTimeCallbacks.onRequestUtcTime();
        Binder.withCleanCallingIdentity(() -> mTimeCallbacks.onRequestUtcTime());
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void requestRefLocation() {
    void requestRefLocation() {
        mLocationRequestCallbacks.onRequestRefLocation();
        Binder.withCleanCallingIdentity(
                () -> mLocationRequestCallbacks.onRequestRefLocation());
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    void reportNfwNotification(String proxyAppPackageName, byte protocolStack,
    void reportNfwNotification(String proxyAppPackageName, byte protocolStack,
            String otherProtocolStackName, byte requestor, String requestorId,
            String otherProtocolStackName, byte requestor, String requestorId,
            byte responseType, boolean inEmergencyMode, boolean isCachedLocation) {
            byte responseType, boolean inEmergencyMode, boolean isCachedLocation) {
        mNotificationCallbacks.onReportNfwNotification(proxyAppPackageName, protocolStack,
        Binder.withCleanCallingIdentity(
                    otherProtocolStackName, requestor, requestorId, responseType, inEmergencyMode,
                () -> mNotificationCallbacks.onReportNfwNotification(proxyAppPackageName,
                    isCachedLocation);
                        protocolStack, otherProtocolStackName, requestor, requestorId, responseType,
                        inEmergencyMode, isCachedLocation));
    }
    }


    @NativeEntryPoint
    @NativeEntryPoint
    boolean isInEmergencySession() {
    boolean isInEmergencySession() {
        return mEmergencyHelper.isInEmergency(mConfiguration.getEsExtensionSec());
        return Binder.withCleanCallingIdentity(
                () -> mEmergencyHelper.isInEmergency(mConfiguration.getEsExtensionSec()));
    }
    }


    /**
    /**