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

Commit 0d4ac562 authored by Brian Duddie's avatar Brian Duddie
Browse files

Reset target SDK version cache on new connection

Avoids possibility that a stale cache is used if cleanupConnection()
does not get called for some reason.

Bug: 230358834
Test: run POC from b/230358834#comment4
Change-Id: I2e7422d90cec87167968d56458af9aac6d525506
parent 820db998
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -1328,6 +1328,7 @@ Vector<Sensor> SensorService::getSensorList(const String16& opPackageName) {
            mSensors.getUserDebugSensors() : mSensors.getUserSensors();
    Vector<Sensor> accessibleSensorList;

    resetTargetSdkVersionCache(opPackageName);
    bool isCapped = isRateCappedBasedOnPermission(opPackageName);
    for (size_t i = 0; i < initialSensorList.size(); i++) {
        Sensor sensor = initialSensorList[i];
@@ -1367,6 +1368,7 @@ sp<ISensorEventConnection> SensorService::createSensorEventConnection(const Stri
    if (requestedMode != NORMAL && requestedMode != DATA_INJECTION) {
        return nullptr;
    }
    resetTargetSdkVersionCache(opPackageName);

    Mutex::Autolock _l(mLock);
    // To create a client in DATA_INJECTION mode to inject data, SensorService should already be
@@ -1402,6 +1404,7 @@ int SensorService::isDataInjectionEnabled() {
sp<ISensorEventConnection> SensorService::createSensorDirectConnection(
        const String16& opPackageName, uint32_t size, int32_t type, int32_t format,
        const native_handle *resource) {
    resetTargetSdkVersionCache(opPackageName);
    ConnectionSafeAutolock connLock = mConnectionHolder.lock(mLock);

    // No new direct connections are allowed when sensor privacy is enabled
@@ -1643,14 +1646,6 @@ void SensorService::cleanupConnection(SensorEventConnection* c) {
        checkWakeLockStateLocked(&connLock);
    }

    {
        Mutex::Autolock packageLock(sPackageTargetVersionLock);
        auto iter = sPackageTargetVersion.find(c->mOpPackageName);
        if (iter != sPackageTargetVersion.end()) {
            sPackageTargetVersion.erase(iter);
        }
    }

    SensorDevice& dev(SensorDevice::getInstance());
    dev.notifyConnectionDestroyed(c);
}
@@ -2091,6 +2086,14 @@ int SensorService::getTargetSdkVersion(const String16& opPackageName) {
    return targetSdkVersion;
}

void SensorService::resetTargetSdkVersionCache(const String16& opPackageName) {
    Mutex::Autolock packageLock(sPackageTargetVersionLock);
    auto iter = sPackageTargetVersion.find(opPackageName);
    if (iter != sPackageTargetVersion.end()) {
        sPackageTargetVersion.erase(iter);
    }
}

void SensorService::checkWakeLockState() {
    ConnectionSafeAutolock connLock = mConnectionHolder.lock(mLock);
    checkWakeLockStateLocked(&connLock);
+1 −0
Original line number Diff line number Diff line
@@ -377,6 +377,7 @@ private:
            const String16& opPackageName);
    static bool hasPermissionForSensor(const Sensor& sensor);
    static int getTargetSdkVersion(const String16& opPackageName);
    static void resetTargetSdkVersionCache(const String16& opPackageName);
    // SensorService acquires a partial wakelock for delivering events from wake up sensors. This
    // method checks whether all the events from these wake up sensors have been delivered to the
    // corresponding applications, if yes the wakelock is released.