diff options
author | Stan Rokita <srok@google.com> | 2020-07-06 17:38:03 -0700 |
---|---|---|
committer | Stan Rokita <srok@google.com> | 2020-07-07 08:30:34 -0700 |
commit | 29adc8ccbea56ca1bd00a054cb8a1f572ff0c114 (patch) | |
tree | 74e8ead08e6e4383ae0654155719ac91c55fcb8a | |
parent | 9b2526e50d375d60e5a6a43992649d9bb25c176a (diff) | |
download | native-29adc8ccbea56ca1bd00a054cb8a1f572ff0c114.tar.gz |
Check if sensor is accessible on flush
In cases where halVersion is less than or equal to 1 or the sensor is
virtual the sensor service does not first check that the sensor is
accessible. This was causing failures for tests where a virtual sensor
was used because the flush command was not returning error. Now
INVALID_OPERATION is returned when flush is called on an idle sensor.
Test: set IGNORE_HARDWARE_FUSION to true and cts-tradefed && run cts -m
CtsSensorTestCases -t
android.hardware.cts.SensorTest#testBatchAndFlushUidIdle which fails
before this change, but passes now
Bug: 160282248
Change-Id: I6860bcdb9be341b5e2025caf7606d071779c9b39
-rw-r--r-- | services/sensorservice/SensorEventConnection.cpp | 15 | ||||
-rw-r--r-- | services/sensorservice/SensorEventConnection.h | 5 | ||||
-rw-r--r-- | services/sensorservice/SensorService.cpp | 5 |
3 files changed, 17 insertions, 8 deletions
diff --git a/services/sensorservice/SensorEventConnection.cpp b/services/sensorservice/SensorEventConnection.cpp index 9b30dceeb9..b4b5f98609 100644 --- a/services/sensorservice/SensorEventConnection.cpp +++ b/services/sensorservice/SensorEventConnection.cpp @@ -272,11 +272,16 @@ void SensorService::SensorEventConnection::updateLooperRegistrationLocked( } } -void SensorService::SensorEventConnection::incrementPendingFlushCount(int32_t handle) { - Mutex::Autolock _l(mConnectionLock); - if (mSensorInfo.count(handle) > 0) { - FlushInfo& flushInfo = mSensorInfo[handle]; - flushInfo.mPendingFlushEventsToSend++; +bool SensorService::SensorEventConnection::incrementPendingFlushCountIfHasAccess(int32_t handle) { + if (hasSensorAccess()) { + Mutex::Autolock _l(mConnectionLock); + if (mSensorInfo.count(handle) > 0) { + FlushInfo& flushInfo = mSensorInfo[handle]; + flushInfo.mPendingFlushEventsToSend++; + } + return true; + } else { + return false; } } diff --git a/services/sensorservice/SensorEventConnection.h b/services/sensorservice/SensorEventConnection.h index 8d5fcf7aa0..8f2d5db28f 100644 --- a/services/sensorservice/SensorEventConnection.h +++ b/services/sensorservice/SensorEventConnection.h @@ -116,8 +116,9 @@ private: // for writing send the data from the cache. virtual int handleEvent(int fd, int events, void* data); - // Increment mPendingFlushEventsToSend for the given sensor handle. - void incrementPendingFlushCount(int32_t handle); + // Increment mPendingFlushEventsToSend for the given handle if the connection has sensor access. + // Returns true if this connection does have sensor access. + bool incrementPendingFlushCountIfHasAccess(int32_t handle); // Add or remove the file descriptor associated with the BitTube to the looper. If mDead is set // to true or there are no more sensors for this connection, the file descriptor is removed if diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index 26e37aa102..60f9cd90c8 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -1774,7 +1774,10 @@ status_t SensorService::flushSensor(const sp<SensorEventConnection>& connection, if (halVersion <= SENSORS_DEVICE_API_VERSION_1_0 || isVirtualSensor(handle)) { // For older devices just increment pending flush count which will send a trivial // flush complete event. - connection->incrementPendingFlushCount(handle); + if (!connection->incrementPendingFlushCountIfHasAccess(handle)) { + ALOGE("flush called on an inaccessible sensor"); + err = INVALID_OPERATION; + } } else { if (!canAccessSensor(sensor->getSensor(), "Tried flushing", opPackageName)) { err = INVALID_OPERATION; |