From 63483ad25280b66bd077b3b5e6864ff22a129e9d Mon Sep 17 00:00:00 2001 From: Peng Xu Date: Tue, 28 Feb 2017 17:00:16 -0800 Subject: [PATCH] Parameter checks for sensor NDK APIs, fix map file * Add parameter check for all sensor NDK APIs. * Added a previously added API (from AOSP contribution) to libandroid.map.txt file. Test: SensorNativeTest pass Change-Id: I6482a684767034f2a31d806a4cba0d6648dcabff --- native/android/libandroid.map.txt | 1 + native/android/sensor.cpp | 148 ++++++++++++++++++------------ 2 files changed, 91 insertions(+), 58 deletions(-) diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt index 1b1f28c374696..c7bed9bc16855 100644 --- a/native/android/libandroid.map.txt +++ b/native/android/libandroid.map.txt @@ -169,6 +169,7 @@ LIBANDROID { ASensorEventQueue_enableSensor; ASensorEventQueue_getEvents; ASensorEventQueue_hasEvents; + ASensorEventQueue_registerSensor; # introduced=26 ASensorEventQueue_setEventRate; ASensorManager_configureDirectReport; # introduced=26 ASensorManager_createEventQueue; diff --git a/native/android/sensor.cpp b/native/android/sensor.cpp index ebb0d1229bea8..ae16949791bc3 100644 --- a/native/android/sensor.cpp +++ b/native/android/sensor.cpp @@ -41,7 +41,7 @@ using android::String16; /*****************************************************************************/ #define ERROR_INVALID_PARAMETER(message) ALOGE("%s: " message, __func__) -// frequently used check +// frequently used checks #define RETURN_IF_MANAGER_IS_NULL(retval) do {\ if (manager == nullptr) { \ ERROR_INVALID_PARAMETER("manager cannot be NULL"); \ @@ -54,14 +54,18 @@ using android::String16; return retval; \ } \ } while (false) +#define RETURN_IF_QUEUE_IS_NULL(retval) do {\ + if (queue == nullptr) { \ + ERROR_INVALID_PARAMETER("queue cannot be NULL"); \ + return retval; \ + } \ + } while (false) -ASensorManager* ASensorManager_getInstance() -{ - return ASensorManager_getInstanceForPackage(NULL); +ASensorManager* ASensorManager_getInstance() { + return ASensorManager_getInstanceForPackage(nullptr); } -ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName) -{ +ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName) { if (packageName) { return &SensorManager::getInstanceForPackage(String16(packageName)); } else { @@ -69,9 +73,8 @@ ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName) } } -int ASensorManager_getSensorList(ASensorManager* manager, - ASensorList* list) -{ +int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list) { + RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); Sensor const* const* l; int c = static_cast(manager)->getSensorList(&l); if (list) { @@ -80,13 +83,13 @@ int ASensorManager_getSensorList(ASensorManager* manager, return c; } -ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type) -{ +ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type) { + RETURN_IF_MANAGER_IS_NULL(nullptr); return static_cast(manager)->getDefaultSensor(type); } -ASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager, - int type, bool wakeUp) { +ASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager, int type, bool wakeUp) { + RETURN_IF_MANAGER_IS_NULL(nullptr); Sensor const* const* sensorList; size_t size = static_cast(manager)->getSensorList(&sensorList); for (size_t i = 0; i < size; ++i) { @@ -95,12 +98,18 @@ ASensor const* ASensorManager_getDefaultSensorEx(ASensorManager* manager, return reinterpret_cast(sensorList[i]); } } - return NULL; + return nullptr; } ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager, - ALooper* looper, int ident, ALooper_callbackFunc callback, void* data) -{ + ALooper* looper, int ident, ALooper_callbackFunc callback, void* data) { + RETURN_IF_MANAGER_IS_NULL(nullptr); + + if (looper == nullptr) { + ERROR_INVALID_PARAMETER("looper cannot be NULL"); + return nullptr; + } + sp queue = static_cast(manager)->createEventQueue(); if (queue != 0) { @@ -111,17 +120,17 @@ ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager, return static_cast(queue.get()); } -int ASensorManager_destroyEventQueue(ASensorManager* manager, - ASensorEventQueue* inQueue) -{ - sp queue = static_cast(inQueue); - ALooper_removeFd(queue->looper, queue->getFd()); - queue->decStrong(manager); +int ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue) { + RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); + RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); + + sp q = static_cast(queue); + ALooper_removeFd(q->looper, q->getFd()); + q->decStrong(manager); return 0; } -int ASensorManager_createSharedMemoryDirectChannel( - ASensorManager *manager, int fd, size_t size) { +int ASensorManager_createSharedMemoryDirectChannel(ASensorManager *manager, int fd, size_t size) { RETURN_IF_MANAGER_IS_NULL(android::BAD_VALUE); if (fd < 0) { @@ -131,6 +140,7 @@ int ASensorManager_createSharedMemoryDirectChannel( if (size < sizeof(ASensorEvent)) { ERROR_INVALID_PARAMETER("size has to be greater or equal to sizeof(ASensorEvent)."); + return android::BAD_VALUE; } native_handle_t *resourceHandle = native_handle_create(1 /* nFd */, 0 /* nInt */); @@ -156,6 +166,7 @@ int ASensorManager_createHardwareBufferDirectChannel( if (size < sizeof(ASensorEvent)) { ERROR_INVALID_PARAMETER("size has to be greater or equal to sizeof(ASensorEvent)."); + return android::BAD_VALUE; } const native_handle_t *resourceHandle = AHardwareBuffer_getNativeHandle(buffer); @@ -195,34 +206,51 @@ int ASensorManager_configureDirectReport( /*****************************************************************************/ int ASensorEventQueue_registerSensor(ASensorEventQueue* queue, ASensor const* sensor, - int32_t samplingPeriodUs, int maxBatchReportLatencyUs) -{ + int32_t samplingPeriodUs, int64_t maxBatchReportLatencyUs) { + RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); + RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); + if (samplingPeriodUs < 0 || maxBatchReportLatencyUs < 0) { + ERROR_INVALID_PARAMETER("samplingPeriodUs and maxBatchReportLatencyUs cannot be negative"); + return android::BAD_VALUE; + } + return static_cast(queue)->enableSensor( static_cast(sensor)->getHandle(), samplingPeriodUs, maxBatchReportLatencyUs, 0); } -int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor) -{ +int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor) { + RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); + RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); + return static_cast(queue)->enableSensor( static_cast(sensor)); } -int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor) -{ +int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor) { + RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); + RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); + return static_cast(queue)->disableSensor( static_cast(sensor)); } -int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, - int32_t usec) -{ +int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec) { + RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); + RETURN_IF_SENSOR_IS_NULL(android::BAD_VALUE); + + if (usec < 0) { + ERROR_INVALID_PARAMETER("usec cannot be negative"); + return android::BAD_VALUE; + } + return static_cast(queue)->setEventRate( static_cast(sensor), us2ns(usec)); } -int ASensorEventQueue_hasEvents(ASensorEventQueue* queue) -{ +int ASensorEventQueue_hasEvents(ASensorEventQueue* queue) { + RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); + struct pollfd pfd; pfd.fd = static_cast(queue)->getFd(); pfd.events = POLLIN; @@ -239,9 +267,13 @@ int ASensorEventQueue_hasEvents(ASensorEventQueue* queue) return (nfd == 0) ? 0 : 1; } -ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue, - ASensorEvent* events, size_t count) -{ +ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue, ASensorEvent* events, size_t count) { + RETURN_IF_QUEUE_IS_NULL(android::BAD_VALUE); + if (events == nullptr) { + ERROR_INVALID_PARAMETER("events cannot be NULL"); + return android::BAD_VALUE; + } + ssize_t actual = static_cast(queue)->read(events, count); if (actual > 0) { static_cast(queue)->sendAck(events, actual); @@ -251,53 +283,53 @@ ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue, /*****************************************************************************/ -const char* ASensor_getName(ASensor const* sensor) -{ +const char* ASensor_getName(ASensor const* sensor) { + RETURN_IF_SENSOR_IS_NULL(nullptr); return static_cast(sensor)->getName().string(); } -const char* ASensor_getVendor(ASensor const* sensor) -{ +const char* ASensor_getVendor(ASensor const* sensor) { + RETURN_IF_SENSOR_IS_NULL(nullptr); return static_cast(sensor)->getVendor().string(); } -int ASensor_getType(ASensor const* sensor) -{ +int ASensor_getType(ASensor const* sensor) { + RETURN_IF_SENSOR_IS_NULL(ASENSOR_TYPE_INVALID); return static_cast(sensor)->getType(); } -float ASensor_getResolution(ASensor const* sensor) -{ +float ASensor_getResolution(ASensor const* sensor) { + RETURN_IF_SENSOR_IS_NULL(ASENSOR_RESOLUTION_INVALID); return static_cast(sensor)->getResolution(); } -int ASensor_getMinDelay(ASensor const* sensor) -{ +int ASensor_getMinDelay(ASensor const* sensor) { + RETURN_IF_SENSOR_IS_NULL(ASENSOR_DELAY_INVALID); return static_cast(sensor)->getMinDelay(); } -int ASensor_getFifoMaxEventCount(ASensor const* sensor) -{ +int ASensor_getFifoMaxEventCount(ASensor const* sensor) { + RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID); return static_cast(sensor)->getFifoMaxEventCount(); } -int ASensor_getFifoReservedEventCount(ASensor const* sensor) -{ +int ASensor_getFifoReservedEventCount(ASensor const* sensor) { + RETURN_IF_SENSOR_IS_NULL(ASENSOR_FIFO_COUNT_INVALID); return static_cast(sensor)->getFifoReservedEventCount(); } -const char* ASensor_getStringType(ASensor const* sensor) -{ +const char* ASensor_getStringType(ASensor const* sensor) { + RETURN_IF_SENSOR_IS_NULL(nullptr); return static_cast(sensor)->getStringType().string(); } -int ASensor_getReportingMode(ASensor const* sensor) -{ +int ASensor_getReportingMode(ASensor const* sensor) { + RETURN_IF_SENSOR_IS_NULL(AREPORTING_MODE_INVALID); return static_cast(sensor)->getReportingMode(); } -bool ASensor_isWakeUpSensor(ASensor const* sensor) -{ +bool ASensor_isWakeUpSensor(ASensor const* sensor) { + RETURN_IF_SENSOR_IS_NULL(false); return static_cast(sensor)->isWakeUpSensor(); }