diff options
| -rw-r--r-- | services/sensorservice/SensorEventConnection.cpp | 15 | ||||
| -rw-r--r-- | services/sensorservice/SensorEventConnection.h | 8 | ||||
| -rw-r--r-- | services/sensorservice/SensorService.cpp | 4 |
3 files changed, 25 insertions, 2 deletions
diff --git a/services/sensorservice/SensorEventConnection.cpp b/services/sensorservice/SensorEventConnection.cpp index c4cfdc63bf..0e409409f2 100644 --- a/services/sensorservice/SensorEventConnection.cpp +++ b/services/sensorservice/SensorEventConnection.cpp @@ -285,8 +285,9 @@ status_t SensorService::SensorEventConnection::sendEvents( scratch[count++] = buffer[i]; } } else { - // Regular sensor event, just copy it to the scratch buffer. - if (hasSensorAccess()) { + // Regular sensor event, just copy it to the scratch buffer after checking + // the AppOp. + if (hasSensorAccess() && noteOpIfRequired(buffer[i])) { scratch[count++] = buffer[i]; } } @@ -386,6 +387,16 @@ bool SensorService::SensorEventConnection::hasSensorAccess() { return mHasSensorAccess && !mService->mSensorPrivacyPolicy->isSensorPrivacyEnabled(); } +bool SensorService::SensorEventConnection::noteOpIfRequired(const sensors_event_t& event) { + bool success = true; + const auto iter = mHandleToAppOp.find(event.sensor); + if (iter != mHandleToAppOp.end()) { + int32_t appOpMode = mService->sAppOpsManager.noteOp((*iter).second, mUid, mOpPackageName); + success = (appOpMode == AppOpsManager::MODE_ALLOWED); + } + return success; +} + void SensorService::SensorEventConnection::reAllocateCacheLocked(sensors_event_t const* scratch, int count) { sensors_event_t *eventCache_new; diff --git a/services/sensorservice/SensorEventConnection.h b/services/sensorservice/SensorEventConnection.h index 70778806ce..fd881cbc0b 100644 --- a/services/sensorservice/SensorEventConnection.h +++ b/services/sensorservice/SensorEventConnection.h @@ -19,6 +19,7 @@ #include <stdint.h> #include <sys/types.h> +#include <unordered_map> #include <utils/Vector.h> #include <utils/SortedVector.h> @@ -134,6 +135,9 @@ private: // privacy not being enabled. bool hasSensorAccess(); + // Call noteOp for the sensor if the sensor requires a permission + bool noteOpIfRequired(const sensors_event_t& event); + sp<SensorService> const mService; sp<BitTube> mChannel; uid_t mUid; @@ -181,6 +185,10 @@ private: mutable Mutex mDestroyLock; bool mDestroyed; bool mHasSensorAccess; + + // Store a mapping of sensor handles to required AppOp for a sensor. This map only contains a + // valid mapping for sensors that require a permission in order to reduce the lookup time. + std::unordered_map<int32_t, int32_t> mHandleToAppOp; }; } // namepsace android diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index 5efff92873..639ce78ed3 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -1550,6 +1550,10 @@ status_t SensorService::enable(const sp<SensorEventConnection>& connection, if (err == NO_ERROR) { connection->updateLooperRegistration(mLooper); + if (sensor->getSensor().getRequiredPermission().size() > 0) { + connection->mHandleToAppOp[handle] = sensor->getSensor().getRequiredAppOp(); + } + mLastNSensorRegistrations.editItemAt(mNextSensorRegIndex) = SensorRegistrationInfo(handle, connection->getPackageName(), samplingPeriodNs, maxBatchReportLatencyNs, true); |