summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Rokita <srok@google.com>2020-07-06 17:38:03 -0700
committerStan Rokita <srok@google.com>2020-07-07 08:30:34 -0700
commit29adc8ccbea56ca1bd00a054cb8a1f572ff0c114 (patch)
tree74e8ead08e6e4383ae0654155719ac91c55fcb8a
parent9b2526e50d375d60e5a6a43992649d9bb25c176a (diff)
downloadnative-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.cpp15
-rw-r--r--services/sensorservice/SensorEventConnection.h5
-rw-r--r--services/sensorservice/SensorService.cpp5
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;