From 698da8a0ba27729d4ee469eb5789650aae4639c6 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 22 Sep 2017 14:12:17 +0900 Subject: [PATCH 01/16] sensord: limit the maximum number of listeners per client - MAX_LISTENER = 100 Change-Id: Ib736ef66f2c50a9a218244a4bc5a41bca52ef0d3 Signed-off-by: kibak.yoon --- src/client/sensor_internal.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client/sensor_internal.cpp b/src/client/sensor_internal.cpp index 22d8840..5a9f042 100644 --- a/src/client/sensor_internal.cpp +++ b/src/client/sensor_internal.cpp @@ -32,6 +32,7 @@ #include #define CONVERT_OPTION_PAUSE_POLICY(option) ((option) ^ 0b11) +#define MAX_LISTENER 100 using namespace sensor; @@ -238,6 +239,7 @@ API int sensord_connect(sensor_t sensor) retvm_if(!manager.connect(), -EIO, "Failed to connect"); retvm_if(!manager.is_supported(sensor), -EINVAL, "Invalid sensor[%p]", sensor); + retvm_if(listeners.size() > MAX_LISTENER, -EPERM, "Exceeded the maximum listener"); sensor::sensor_listener *listener; -- 2.7.4 From 1ee7ae20a3447a8a89283f0656a87c5272edf1b1 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 22 Sep 2017 14:15:32 +0900 Subject: [PATCH 02/16] sensord: check the range of values provided from the client Change-Id: Ib6102f684dd1b5ee877b28aa871f7b6b169adf23 Signed-off-by: kibak.yoon --- src/client/sensor_provider.cpp | 17 ++++++++++++++--- src/shared/sensor_info.cpp | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/client/sensor_provider.cpp b/src/client/sensor_provider.cpp index 50772d5..aec9c22 100644 --- a/src/client/sensor_provider.cpp +++ b/src/client/sensor_provider.cpp @@ -26,9 +26,12 @@ #include #include #include +#include #include "sensor_provider_channel_handler.h" +#define DEFAULT_RESOLUTION 0.1 + using namespace sensor; sensor_provider::sensor_provider(const char *uri) @@ -57,9 +60,9 @@ bool sensor_provider::init(const char *uri) } m_sensor.set_uri(uri); - m_sensor.set_min_range(0); - m_sensor.set_max_range(1); - m_sensor.set_resolution(1); + m_sensor.set_min_range(-FLT_MAX); + m_sensor.set_max_range(FLT_MAX); + m_sensor.set_resolution(DEFAULT_RESOLUTION); /* TODO: temporary walkaround */ const char *priv = sensor::utils::get_privilege(uri); m_sensor.set_privilege(priv); @@ -166,6 +169,14 @@ void sensor_provider::restore(void) int sensor_provider::publish(sensor_data_t *data, int len) { + for (int i = 0; i < data->value_count; ++i) { + if (data->values[i] < m_sensor.get_min_range() || + data->values[i] > m_sensor.get_max_range()) { + _E("Out of range"); + return OP_ERROR; + } + } + ipc::message msg; msg.set_type(CMD_PROVIDER_PUBLISH); msg.enclose((const char *)data, len); diff --git a/src/shared/sensor_info.cpp b/src/shared/sensor_info.cpp index e56be7e..bcb1930 100644 --- a/src/shared/sensor_info.cpp +++ b/src/shared/sensor_info.cpp @@ -22,11 +22,15 @@ #include #include #include +#include #include #include #include "sensor_utils.h" +#define MIN_RANGE -FLT_MAX +#define MAX_RANGE FLT_MAX + using namespace sensor; sensor_info::sensor_info() @@ -176,11 +180,21 @@ void sensor_info::set_vendor(const char *vendor) void sensor_info::set_min_range(float min_range) { m_min_range = min_range; + + if (m_min_range < MIN_RANGE) + m_min_range = MIN_RANGE; + if (m_min_range > MAX_RANGE) + m_min_range = MAX_RANGE; } void sensor_info::set_max_range(float max_range) { m_max_range = max_range; + + if (m_max_range < MIN_RANGE) + m_max_range = MIN_RANGE; + if (m_max_range > MAX_RANGE) + m_max_range = MAX_RANGE; } void sensor_info::set_resolution(float resolution) -- 2.7.4 From 303c2fcef5f3582cc756d949db1e749553cc31b1 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 22 Sep 2017 17:08:56 +0900 Subject: [PATCH 03/16] sensord: version up 4.0.3 Change-Id: I25f0435ab579d3e541f9a3ed1308879c7388868a Signed-off-by: kibak.yoon --- packaging/sensord.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/sensord.spec b/packaging/sensord.spec index b96b6fe..2cf492e 100644 --- a/packaging/sensord.spec +++ b/packaging/sensord.spec @@ -1,6 +1,6 @@ Name: sensord Summary: Sensor daemon -Version: 4.0.2 +Version: 4.0.3 Release: 1 Group: System/Sensor Framework License: Apache-2.0 -- 2.7.4 From 29caec272fffe2792f82d872c13d8f4c9e80b3fb Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Wed, 11 Oct 2017 10:49:38 +0900 Subject: [PATCH 04/16] sensor: fix problem that gyroscope rotation vector does not work Change-Id: I7a6e4305bb982d36c87cc4b2f3789c0b09f02c55 Signed-off-by: kibak.yoon --- .../rotation_vector/fusion_utils/orientation_filter.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/sensor/rotation_vector/fusion_utils/orientation_filter.cpp b/src/sensor/rotation_vector/fusion_utils/orientation_filter.cpp index e352f5b..43ea867 100644 --- a/src/sensor/rotation_vector/fusion_utils/orientation_filter.cpp +++ b/src/sensor/rotation_vector/fusion_utils/orientation_filter.cpp @@ -285,15 +285,9 @@ inline void orientation_filter::time_update_gaming_rv() euler_aid = quat2euler(m_quat_aid); euler_driv = quat2euler(m_quat_output); - if ((SQUARE(m_accel.m_data.m_vec[1]) < ACCEL_THRESHOLD) && (SQUARE(m_gyro.m_data.m_vec[0]) < GYRO_THRESHOLD)) { - if ((SQUARE(m_accel.m_data.m_vec[0]) < ACCEL_THRESHOLD) && (SQUARE(m_gyro.m_data.m_vec[1]) < GYRO_THRESHOLD)) { - if (SQUARE(m_gyro.m_data.m_vec[2]) < GYRO_THRESHOLD) { - euler_angles euler_gaming_rv(euler_aid.m_ang.m_vec[0], euler_aid.m_ang.m_vec[1], - euler_driv.m_ang.m_vec[2]); - m_quat_gaming_rv = euler2quat(euler_gaming_rv); - } - } - } + euler_angles euler_gaming_rv(euler_aid.m_ang.m_vec[0], euler_aid.m_ang.m_vec[1], + euler_driv.m_ang.m_vec[2]); + m_quat_gaming_rv = euler2quat(euler_gaming_rv); if (is_initialized(m_state_new)) { m_state_error.m_vec[0] = m_euler_error.m_ang.m_vec[0]; -- 2.7.4 From e9e7d98e4a3c68fca14e28ab23a1e53bf2bd4cd2 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 13 Oct 2017 23:03:59 +0900 Subject: [PATCH 05/16] sensor: check if the event value is NaN Change-Id: I97615392d32d7435e74788cc28f13b56f8e72549 Signed-off-by: kibak.yoon --- src/client/sensor_provider.cpp | 6 +++++- src/shared/sensor_info.cpp | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/client/sensor_provider.cpp b/src/client/sensor_provider.cpp index aec9c22..2855b1f 100644 --- a/src/client/sensor_provider.cpp +++ b/src/client/sensor_provider.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include "sensor_provider_channel_handler.h" @@ -170,7 +171,10 @@ void sensor_provider::restore(void) int sensor_provider::publish(sensor_data_t *data, int len) { for (int i = 0; i < data->value_count; ++i) { - if (data->values[i] < m_sensor.get_min_range() || + if (std::isnan(data->values[i]) || + std::isnan(m_sensor.get_min_range()) || + std::isnan(m_sensor.get_max_range()) || + data->values[i] < m_sensor.get_min_range() || data->values[i] > m_sensor.get_max_range()) { _E("Out of range"); return OP_ERROR; diff --git a/src/shared/sensor_info.cpp b/src/shared/sensor_info.cpp index bcb1930..855695c 100644 --- a/src/shared/sensor_info.cpp +++ b/src/shared/sensor_info.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "sensor_utils.h" @@ -181,6 +182,8 @@ void sensor_info::set_min_range(float min_range) { m_min_range = min_range; + if (std::isnan(m_min_range)) + m_min_range = 0; /* set value to 0 when the value is NaN */ if (m_min_range < MIN_RANGE) m_min_range = MIN_RANGE; if (m_min_range > MAX_RANGE) @@ -191,6 +194,8 @@ void sensor_info::set_max_range(float max_range) { m_max_range = max_range; + if (std::isnan(m_max_range)) + m_max_range = 1; /* set value to 1 when the value is NaN */ if (m_max_range < MIN_RANGE) m_max_range = MIN_RANGE; if (m_max_range > MAX_RANGE) -- 2.7.4 From 2b50eaf74210901c1c8f817b31f8c58621ba4243 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 16 Oct 2017 11:47:22 +0900 Subject: [PATCH 06/16] sensord: check if the event value is a valid number Change-Id: I414f8a6f71baad87ec3dd9538d5ee60b8c3a5edf Signed-off-by: kibak.yoon --- src/client/sensor_provider.cpp | 7 ++----- src/shared/sensor_info.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/client/sensor_provider.cpp b/src/client/sensor_provider.cpp index 2855b1f..e742309 100644 --- a/src/client/sensor_provider.cpp +++ b/src/client/sensor_provider.cpp @@ -171,11 +171,8 @@ void sensor_provider::restore(void) int sensor_provider::publish(sensor_data_t *data, int len) { for (int i = 0; i < data->value_count; ++i) { - if (std::isnan(data->values[i]) || - std::isnan(m_sensor.get_min_range()) || - std::isnan(m_sensor.get_max_range()) || - data->values[i] < m_sensor.get_min_range() || - data->values[i] > m_sensor.get_max_range()) { + if (!(data->values[i] >= m_sensor.get_min_range() && + data->values[i] <= m_sensor.get_max_range())) { _E("Out of range"); return OP_ERROR; } diff --git a/src/shared/sensor_info.cpp b/src/shared/sensor_info.cpp index 855695c..5a87539 100644 --- a/src/shared/sensor_info.cpp +++ b/src/shared/sensor_info.cpp @@ -182,8 +182,8 @@ void sensor_info::set_min_range(float min_range) { m_min_range = min_range; - if (std::isnan(m_min_range)) - m_min_range = 0; /* set value to 0 when the value is NaN */ + if (!std::isnormal(m_min_range)) + m_min_range = 0; /* set value to 0 when the value is NaN, infinity, zero or subnormal */ if (m_min_range < MIN_RANGE) m_min_range = MIN_RANGE; if (m_min_range > MAX_RANGE) @@ -194,8 +194,8 @@ void sensor_info::set_max_range(float max_range) { m_max_range = max_range; - if (std::isnan(m_max_range)) - m_max_range = 1; /* set value to 1 when the value is NaN */ + if (!std::isnormal(m_max_range)) + m_max_range = 0; /* set value to 0 when the value is NaN, infinity, zero or subnormal */ if (m_max_range < MIN_RANGE) m_max_range = MIN_RANGE; if (m_max_range > MAX_RANGE) -- 2.7.4 From aaf347d3a48a5b313fcba57cb85c30a7cec773b2 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Wed, 25 Oct 2017 00:27:04 +0900 Subject: [PATCH 07/16] sensord: caching data to get previous data - Svace/Coverity : no issue - tct is passed : utc/itc 100% Change-Id: If6e023acf3d189869183fc33220562f2013534da Signed-off-by: kibak.yoon --- src/server/sensor_handler.cpp | 28 ++++++++++++++++++++++++++++ src/server/sensor_handler.h | 6 ++++++ src/server/sensor_listener_proxy.cpp | 3 +-- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/server/sensor_handler.cpp b/src/server/sensor_handler.cpp index 2a2eb6a..37c4dc2 100644 --- a/src/server/sensor_handler.cpp +++ b/src/server/sensor_handler.cpp @@ -28,6 +28,8 @@ using namespace sensor; sensor_handler::sensor_handler(const sensor_info &info) : m_info(info) +, m_last_data(NULL) +, m_last_data_size(0) { const char *priv = sensor::utils::get_privilege(m_info.get_uri()); m_info.set_privilege(priv); @@ -84,6 +86,8 @@ int sensor_handler::notify(const char *uri, sensor_data_t *data, int len) if (msg->ref_count() == 0) msg->unref(); + set_cache(data, len); + return OP_SUCCESS; } @@ -91,3 +95,27 @@ uint32_t sensor_handler::observer_count(void) { return m_observers.size(); } + +void sensor_handler::set_cache(sensor_data_t *data, int size) +{ + if (m_last_data == NULL) { + m_last_data = (sensor_data_t*)malloc(size); + retm_if(m_last_data == NULL, "Memory allocation failed"); + } + + m_last_data_size = size; + memcpy(m_last_data, data, size); +} + +int sensor_handler::get_cache(sensor_data_t **data, int *len) +{ + retv_if(m_last_data == NULL, -ENODATA); + + *data = (sensor_data_t *)malloc(m_last_data_size); + retvm_if(*data == NULL, -ENOMEM, "Memory allocation failed"); + + memcpy(*data, m_last_data, m_last_data_size); + *len = m_last_data_size; + + return 0; +} diff --git a/src/server/sensor_handler.h b/src/server/sensor_handler.h index 37774e9..db237e4 100644 --- a/src/server/sensor_handler.h +++ b/src/server/sensor_handler.h @@ -52,11 +52,17 @@ public: virtual int flush(sensor_observer *ob) = 0; virtual int get_data(sensor_data_t **data, int *len) = 0; + void set_cache(sensor_data_t *data, int size); + int get_cache(sensor_data_t **data, int *len); + protected: sensor_info m_info; private: std::list m_observers; + + sensor_data_t *m_last_data; + int m_last_data_size; }; } diff --git a/src/server/sensor_listener_proxy.cpp b/src/server/sensor_listener_proxy.cpp index a850018..2a704cd 100644 --- a/src/server/sensor_listener_proxy.cpp +++ b/src/server/sensor_listener_proxy.cpp @@ -191,8 +191,7 @@ int sensor_listener_proxy::get_data(sensor_data_t **data, int *len) sensor_handler *sensor = m_manager->get_sensor(m_uri); retv_if(!sensor, -EINVAL); - /* TODO : caching the last data & retry logic if there is no data */ - return sensor->get_data(data, len); + return sensor->get_cache(data, len); } std::string sensor_listener_proxy::get_required_privileges(void) -- 2.7.4 From ac8515b9e3ac4678dfda3b73f5b2a63d5cd6ddb4 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Mon, 13 Nov 2017 12:09:55 +0900 Subject: [PATCH 08/16] sensor: gyro-rv: fix invalid order of sensor data Change-Id: I7554129c77434aca6eb5871dc4d0ad28597d91a1 Signed-off-by: kibak.yoon --- src/sensor/rotation_vector/gyro_rv_sensor.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sensor/rotation_vector/gyro_rv_sensor.cpp b/src/sensor/rotation_vector/gyro_rv_sensor.cpp index 1a0aaaa..8f2d9bb 100644 --- a/src/sensor/rotation_vector/gyro_rv_sensor.cpp +++ b/src/sensor/rotation_vector/gyro_rv_sensor.cpp @@ -109,10 +109,10 @@ int gyro_rv_sensor::get_data(sensor_data_t **data, int *length) sensor_data->accuracy = m_accuracy; sensor_data->timestamp = m_time; sensor_data->value_count = 4; - sensor_data->values[0] = m_w; - sensor_data->values[1] = m_x; - sensor_data->values[2] = m_y; - sensor_data->values[3] = m_z; + sensor_data->values[0] = m_x; + sensor_data->values[1] = m_y; + sensor_data->values[2] = m_z; + sensor_data->values[3] = m_w; *data = sensor_data; *length = sizeof(sensor_data_t); -- 2.7.4 From 8ac01686ee36a4159e44e3538f8b5e9f33ecf612 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 16 Nov 2017 21:06:48 +0900 Subject: [PATCH 09/16] sensord: resize message size - if there are so many sensors in the device, memory size 4096 is too small to contain all of that sensor information. for example, Gear S3 has 43 sensors including virtual sensors. it needs 7000 byte for information of all sensors. - so message size should be resized from 4096(4kB) to 10240(10kB). Change-Id: Ied553e260216258295d2337a6f0c468e4a2490cc Signed-off-by: kibak.yoon --- src/shared/command_types.h | 2 +- src/shared/message.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared/command_types.h b/src/shared/command_types.h index a994f29..34cb5fc 100644 --- a/src/shared/command_types.h +++ b/src/shared/command_types.h @@ -24,7 +24,7 @@ #include "sensor_info.h" #define SENSOR_CHANNEL_PATH "/run/.sensord.socket" -#define MAX_BUF_SIZE 4096 +#define MAX_BUF_SIZE 10240 /* TODO: OOP - create serializer interface */ enum cmd_type_e { diff --git a/src/shared/message.h b/src/shared/message.h index 111cd9b..3b8fb67 100644 --- a/src/shared/message.h +++ b/src/shared/message.h @@ -23,7 +23,7 @@ #include /* size_t */ #include -#define MAX_MSG_CAPACITY 4096 +#define MAX_MSG_CAPACITY 10240 #define MAX_HEADER_RESERVED 3 namespace ipc { -- 2.7.4 From 90027075c1edab60bb22f525fdcede09e6e39707 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 16 Nov 2017 21:14:03 +0900 Subject: [PATCH 10/16] sensord: change the style to URI if it is unknown type - Bug Fix Change-Id: Id56d8bad087a13db8dda4e441b75e0969235604b Signed-off-by: kibak.yoon --- src/shared/sensor_utils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/sensor_utils.cpp b/src/shared/sensor_utils.cpp index 9cd8141..9bae0e6 100644 --- a/src/shared/sensor_utils.cpp +++ b/src/shared/sensor_utils.cpp @@ -128,7 +128,7 @@ const char *sensor::utils::get_uri(sensor_type_t type) { auto it = types.find(type); if (it == types.end()) - return "Unknown Type"; + return types[UNKNOWN_SENSOR]; return it->second; } -- 2.7.4 From ee6b37a9754c61e5573437389a0e190ddf026b5d Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 24 Nov 2017 19:29:26 +0900 Subject: [PATCH 11/16] sensord: allocate buf memory for string attribute Change-Id: I7c9c0738a2a574a74aefcf10ab4f49fa180be23d Signed-off-by: kibak.yoon --- src/client/sensor_listener.cpp | 4 ++++ src/shared/command_types.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/client/sensor_listener.cpp b/src/client/sensor_listener.cpp index 7c62ea1..b8db2a2 100644 --- a/src/client/sensor_listener.cpp +++ b/src/client/sensor_listener.cpp @@ -392,6 +392,10 @@ int sensor_listener::set_attribute(int attribute, const char *value, int len) msg.set_type(CMD_LISTENER_ATTR_STR); buf.listener_id = m_id; buf.attribute = attribute; + + buf.value = new(std::nothrow) char[len]; + retvm_if(!buf.value, -ENOMEM, "Failed to allocate memory"); + memcpy(buf.value, value, len); buf.len = len; diff --git a/src/shared/command_types.h b/src/shared/command_types.h index 34cb5fc..d28107d 100644 --- a/src/shared/command_types.h +++ b/src/shared/command_types.h @@ -88,7 +88,7 @@ typedef struct { int listener_id; int attribute; int len; - char value[0]; + char *value; } cmd_listener_attr_str_t; typedef struct { -- 2.7.4 From 0797972f96213fe7dee4d1b4daf36b55aef0d41a Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 24 Nov 2017 19:35:34 +0900 Subject: [PATCH 12/16] sensord: return proper error value Change-Id: I40bc157bad5027121bd6e6d3559a71a7d74dff91 Signed-off-by: kibak.yoon --- src/client/sensor_listener.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/sensor_listener.cpp b/src/client/sensor_listener.cpp index b8db2a2..76c82e0 100644 --- a/src/client/sensor_listener.cpp +++ b/src/client/sensor_listener.cpp @@ -362,7 +362,7 @@ int sensor_listener::set_attribute(int attribute, int value) ipc::message reply; cmd_listener_attr_int_t buf; - retvm_if(!m_cmd_channel, false, "Failed to connect to server"); + retvm_if(!m_cmd_channel, -EIO, "Failed to connect to server"); buf.listener_id = m_id; buf.attribute = attribute; @@ -387,7 +387,7 @@ int sensor_listener::set_attribute(int attribute, const char *value, int len) ipc::message reply; cmd_listener_attr_str_t buf; - retvm_if(!m_cmd_channel, false, "Failed to connect to server"); + retvm_if(!m_cmd_channel, -EIO, "Failed to connect to server"); msg.set_type(CMD_LISTENER_ATTR_STR); buf.listener_id = m_id; @@ -413,7 +413,7 @@ int sensor_listener::get_sensor_data(sensor_data_t *data) ipc::message reply; cmd_listener_get_data_t buf; - retvm_if(!m_cmd_channel, false, "Failed to connect to server"); + retvm_if(!m_cmd_channel, -EIO, "Failed to connect to server"); buf.listener_id = m_id; msg.set_type(CMD_LISTENER_GET_DATA); -- 2.7.4 From d96ef2df15cc6d1161c87155119703a95ce175cb Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Wed, 29 Nov 2017 15:47:17 +0900 Subject: [PATCH 13/16] sensord: fix memory allocation to set string attribute to sensor Change-Id: If6f846a5bfd4149deb12fee58b2ac7b9914242af Signed-off-by: kibak.yoon --- src/client/sensor_listener.cpp | 23 +++++++++++++-------- src/sensorctl/testcase/sensor_listener.cpp | 23 +++++++++++++++++++++ src/server/sensor_listener_proxy.cpp | 2 +- src/server/server_channel_handler.cpp | 33 ++++++++++++++++++++++-------- 4 files changed, 62 insertions(+), 19 deletions(-) diff --git a/src/client/sensor_listener.cpp b/src/client/sensor_listener.cpp index 76c82e0..f20c3d1 100644 --- a/src/client/sensor_listener.cpp +++ b/src/client/sensor_listener.cpp @@ -385,25 +385,30 @@ int sensor_listener::set_attribute(int attribute, const char *value, int len) { ipc::message msg; ipc::message reply; - cmd_listener_attr_str_t buf; + cmd_listener_attr_str_t *buf; + size_t size; retvm_if(!m_cmd_channel, -EIO, "Failed to connect to server"); - msg.set_type(CMD_LISTENER_ATTR_STR); - buf.listener_id = m_id; - buf.attribute = attribute; + size = sizeof(cmd_listener_attr_str_t) + len; - buf.value = new(std::nothrow) char[len]; - retvm_if(!buf.value, -ENOMEM, "Failed to allocate memory"); + buf = (cmd_listener_attr_str_t *) new(std::nothrow) char[size]; + retvm_if(!buf, -ENOMEM, "Failed to allocate memory"); - memcpy(buf.value, value, len); - buf.len = len; + msg.set_type(CMD_LISTENER_ATTR_STR); + buf->listener_id = m_id; + buf->attribute = attribute; + + memcpy(buf->value, value, len); + buf->len = len; - msg.enclose((char *)&buf, sizeof(buf) + len); + msg.enclose((char *)buf, size); m_cmd_channel->send_sync(&msg); m_cmd_channel->read_sync(reply); + delete [] buf; + return reply.header()->err; } diff --git a/src/sensorctl/testcase/sensor_listener.cpp b/src/sensorctl/testcase/sensor_listener.cpp index f92d33a..ebff117 100644 --- a/src/sensorctl/testcase/sensor_listener.cpp +++ b/src/sensorctl/testcase/sensor_listener.cpp @@ -223,3 +223,26 @@ TESTCASE(sensor_listener, bad_disconnect_p_2) return true; } + +#define TEST_STRING "TESTTESTTEST" +#define TEST_STRING_LEN 12 + +TESTCASE(sensor_listener, attribute_string_1) +{ + int err; + bool ret; + int handle; + sensor_t sensor; + + err = sensord_get_default_sensor(ACCELEROMETER_SENSOR, &sensor); + ASSERT_EQ(err, 0); + + handle = sensord_connect(sensor); + err = sensord_set_attribute_str(handle, 1, TEST_STRING, TEST_STRING_LEN); + ASSERT_EQ(err, 0); + + ret = sensord_disconnect(handle); + ASSERT_TRUE(ret); + + return true; +} diff --git a/src/server/sensor_listener_proxy.cpp b/src/server/sensor_listener_proxy.cpp index 2a704cd..8d3c3bc 100644 --- a/src/server/sensor_listener_proxy.cpp +++ b/src/server/sensor_listener_proxy.cpp @@ -173,7 +173,7 @@ int sensor_listener_proxy::set_attribute(int attribute, const char *value, int l sensor_handler *sensor = m_manager->get_sensor(m_uri); retv_if(!sensor, -EINVAL); - _D("Listener[%d] try to set attribute[%d, %s]", get_id(), attribute, value); + _D("Listener[%d] try to set string attribute[%d], len[%d]", get_id(), attribute, len); return sensor->set_attribute(this, attribute, value, len); } diff --git a/src/server/server_channel_handler.cpp b/src/server/server_channel_handler.cpp index 2188c61..ff66ec3 100644 --- a/src/server/server_channel_handler.cpp +++ b/src/server/server_channel_handler.cpp @@ -237,19 +237,34 @@ int server_channel_handler::listener_attr_int(channel *ch, message &msg) int server_channel_handler::listener_attr_str(channel *ch, message &msg) { - cmd_listener_attr_str_t buf; - msg.disclose((char *)&buf); - uint32_t id = buf.listener_id; + uint32_t id; + cmd_listener_attr_str_t *buf; + + buf = (cmd_listener_attr_str_t *) new(std::nothrow) char[msg.size()]; + retvm_if(!buf, -ENOMEM, "Failed to allocate memory"); + msg.disclose((char *)buf); + + id = buf->listener_id; auto it = m_listeners.find(id); - retv_if(it == m_listeners.end(), -EINVAL); - retvm_if(!has_privileges(ch->get_fd(), m_listeners[id]->get_required_privileges()), - -EACCES, "Permission denied[%d, %s]", - id, m_listeners[id]->get_required_privileges().c_str()); + if (it == m_listeners.end()) { + delete [] buf; + return -EINVAL; + } - int ret = m_listeners[id]->set_attribute(buf.attribute, buf.value, buf.len); - retv_if(ret < 0, ret); + if (!has_privileges(ch->get_fd(), m_listeners[id]->get_required_privileges())) { + _E("Permission denied[%d, %s]", id, m_listeners[id]->get_required_privileges().c_str()); + delete [] buf; + return -EACCES; + } + + int ret = m_listeners[id]->set_attribute(buf->attribute, buf->value, buf->len); + if (ret < 0) { + delete [] buf; + return ret; + } + delete [] buf; return send_reply(ch, OP_SUCCESS); } -- 2.7.4 From 7ba92369daaf123ba34fa8e9a8544912abd5bb61 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Tue, 28 Nov 2017 21:11:18 +0900 Subject: [PATCH 14/16] sensorctl: fix filter option to work properly when testing Change-Id: I364c48a5f352b3d6280ca691cc7a8a0da337f3ca Signed-off-by: kibak.yoon --- src/sensorctl/test_bench.cpp | 53 ++++++++++++++++++++++++++++++++--------- src/sensorctl/test_bench.h | 5 +++- src/sensorctl/tester_manual.cpp | 2 +- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/sensorctl/test_bench.cpp b/src/sensorctl/test_bench.cpp index 8e5b5d8..267fec9 100644 --- a/src/sensorctl/test_bench.cpp +++ b/src/sensorctl/test_bench.cpp @@ -216,13 +216,13 @@ void test_bench::add_failure(const std::string &function, long line, const std:: void test_bench::started(void) { _I("[==========] "); - _N("Running %d testcases\n", count()); + _N("Running %d testcase(s)\n", count()); } void test_bench::stopped(void) { _I("[==========] "); - _N("%d testcases ran\n", count()); + _N("%d testcase(s) ran\n", count()); } void test_bench::show(void) @@ -265,18 +265,41 @@ void test_bench::show_failures(void) } } -bool test_bench::filter(const std::string &name) +bool test_bench::filter(const std::string &name, const std::string &filter_str) { - static std::regex filter(test_option::filter.c_str(), std::regex::optimize); - if (!std::regex_match(name, filter)) { - //_W("Not Matched : %s(%s)\n", name.c_str(), test_option::filter.c_str()); - return false; + try { + std::regex filter(filter_str.c_str(), std::regex::optimize); + if (!std::regex_match(name, filter)) + return false; + } catch (std::regex_error &e) { } - //_I("Matched : %s(%s)\n", name.c_str(), test_option::filter.c_str()); return true; } +bool test_bench::filter_name(const std::string &name) +{ + std::size_t gindex = test_option::filter.find("."); + if (gindex == std::string::npos) + return true; + + std::size_t size = test_option::filter.size(); + std::string filter_name = test_option::filter.substr(gindex + 1, size); + + return filter(name, filter_name); +} + +bool test_bench::filter_group(const std::string &group) +{ + std::size_t gindex = test_option::filter.find("."); + if (gindex == std::string::npos) + gindex = test_option::filter.size(); + + std::string filter_group = test_option::filter.substr(0, gindex); + + return filter(group, filter_group); +} + void test_bench::run(void) { m_failure_count = 0; @@ -287,7 +310,7 @@ void test_bench::run(void) for (auto it = testcases.begin(); it != testcases.end(); it = testcases.upper_bound(it->first)) { if (m_stop) break; - if (!filter(it->second->fullname())) continue; + if (!filter_group(it->second->group())) continue; auto range = testcases.equal_range(it->first); @@ -297,6 +320,8 @@ void test_bench::run(void) _I("[----------] %d tests from %s\n", testcases.count(it->first), it->first.c_str()); for (auto testcase = range.first; testcase != range.second; ++testcase) { if (m_stop) break; + if (!filter_name(testcase->second->name())) continue; + testcase->second->run_testcase(); } @@ -316,10 +341,16 @@ void test_bench::stop(void) unsigned int test_bench::count(void) { - int count = 0; + static int count = -1; + if (count != -1) + return count; + count = 0; for (auto it = testcases.begin(); it != testcases.end(); ++it) { - if (!filter(it->second->fullname())) + if (!filter_group(it->second->group())) + continue; + + if (!filter_name(it->second->name())) continue; count++; diff --git a/src/sensorctl/test_bench.h b/src/sensorctl/test_bench.h index f70fdeb..4e04b85 100644 --- a/src/sensorctl/test_bench.h +++ b/src/sensorctl/test_bench.h @@ -197,7 +197,10 @@ private: void add_testcase(const std::string &group, test_case *testcase); - bool filter(const std::string &name); + bool filter(const std::string &name, const std::string &filter); + bool filter_name(const std::string &name); + bool filter_group(const std::string &group); + void run(void); void stop(void); diff --git a/src/sensorctl/tester_manual.cpp b/src/sensorctl/tester_manual.cpp index cc10bd1..7d8c311 100644 --- a/src/sensorctl/tester_manual.cpp +++ b/src/sensorctl/tester_manual.cpp @@ -93,7 +93,7 @@ bool tester_manual::teardown(void) bool tester_manual::run(int argc, char *argv[]) { - test_option::filter = "^manual[\\w\\.]+"; + test_option::filter = "manual_test.sensor"; test_bench::run_all_testcases(); return true; -- 2.7.4 From 8d475f50e9f1bae76364866226ece739e5946c4b Mon Sep 17 00:00:00 2001 From: Abhishek Vijay Date: Thu, 22 Mar 2018 18:44:25 +0530 Subject: [PATCH 15/16] [Coverity Issue Fixes] Signed-off-by: Abhishek Vijay Change-Id: Id8deb54c5e92b85de2b706f2bd7a7072b5666226 --- .../rotation_vector/fusion_utils/orientation_filter.cpp | 1 + .../rotation_vector/fusion_utils/orientation_filter.h | 2 -- src/sensorctl/info.cpp | 6 +++++- src/sensorctl/injector.h | 2 +- src/sensorctl/sensor_adapter.cpp | 10 +++++++++- src/sensorctl/sensorctl.cpp | 6 +++--- src/sensorctl/test_bench.h | 3 +++ src/sensorctl/testcase/sensor_listener.cpp | 14 +++++++++++--- src/sensorctl/testcase/sensor_provider.cpp | 2 +- src/server/server_channel_handler.cpp | 17 ++++++++++++----- src/shared/message.cpp | 9 +++++++++ 11 files changed, 55 insertions(+), 17 deletions(-) diff --git a/src/sensor/rotation_vector/fusion_utils/orientation_filter.cpp b/src/sensor/rotation_vector/fusion_utils/orientation_filter.cpp index 43ea867..2b03cf0 100644 --- a/src/sensor/rotation_vector/fusion_utils/orientation_filter.cpp +++ b/src/sensor/rotation_vector/fusion_utils/orientation_filter.cpp @@ -65,6 +65,7 @@ orientation_filter::orientation_filter() m_var_azimuth = vec; m_gyro.m_time_stamp = 0; + m_gyro_dt = 0; } template diff --git a/src/sensor/rotation_vector/fusion_utils/orientation_filter.h b/src/sensor/rotation_vector/fusion_utils/orientation_filter.h index eaea224..5c5e6b9 100644 --- a/src/sensor/rotation_vector/fusion_utils/orientation_filter.h +++ b/src/sensor/rotation_vector/fusion_utils/orientation_filter.h @@ -89,6 +89,4 @@ public: const sensor_data *gyro, const sensor_data *magnetic); }; -#include "orientation_filter.cpp" - #endif /* _ORIENTATION_FILTER_H_ */ diff --git a/src/sensorctl/info.cpp b/src/sensorctl/info.cpp index 149b98c..43b73f1 100644 --- a/src/sensorctl/info.cpp +++ b/src/sensorctl/info.cpp @@ -20,6 +20,7 @@ #include "info.h" #include +#include #include #include @@ -44,7 +45,10 @@ bool info_manager::run(int argc, char *argv[]) sensord_get_sensor_list(type, &sensors, &count); show_info(sensors, count); - delete sensors; + if (sensors) { + free(sensors); + sensors = NULL; + } return true; } diff --git a/src/sensorctl/injector.h b/src/sensorctl/injector.h index b487c91..1742200 100644 --- a/src/sensorctl/injector.h +++ b/src/sensorctl/injector.h @@ -39,7 +39,7 @@ public: virtual bool teardown(void) { return true; } const std::string& name() const { return m_name; } - const sensor_type_t type() const { return m_type; } + sensor_type_t type() { return m_type; } virtual bool inject(int argc, char *argv[]) = 0; diff --git a/src/sensorctl/sensor_adapter.cpp b/src/sensorctl/sensor_adapter.cpp index 13bc4e5..7deec68 100644 --- a/src/sensorctl/sensor_adapter.cpp +++ b/src/sensorctl/sensor_adapter.cpp @@ -66,26 +66,34 @@ bool sensor_adapter::get_handle(sensor_info info, int &handle) bool sensor_adapter::start(sensor_info info, int &handle) { - sensor_t *sensors; + sensor_t *sensors = NULL; int count; int err; bool ret; err = sensord_get_sensors(info.type, &sensors, &count); ASSERT_EQ(err, 0); + + ASSERT_FREE((info.index >= count), sensors); ASSERT_LT(info.index, count); + + ASSERT_FREE((info.index < 0), sensors); ASSERT_GE(info.index, 0); handle = sensord_connect(sensors[info.index]); + ASSERT_FREE((handle < 0), sensors); ASSERT_GE(handle, 0); ret = sensord_register_event(handle, SENSOR_EVENT(info.type), info.interval, info.batch_latency, info.cb, NULL); + ASSERT_FREE((ret != true), sensors); ASSERT_TRUE(ret); ret = sensord_start(handle, info.powersave); + ASSERT_FREE((ret != true), sensors); ASSERT_TRUE(ret); free(sensors); + sensors = NULL; return true; } diff --git a/src/sensorctl/sensorctl.cpp b/src/sensorctl/sensorctl.cpp index a35e286..415960f 100644 --- a/src/sensorctl/sensorctl.cpp +++ b/src/sensorctl/sensorctl.cpp @@ -47,11 +47,11 @@ static sensor_manager *create_manager(char *command) if (!strcmp(command, "test")) manager = new(std::nothrow) tester_manager; - if (!strcmp(command, "inject")) + else if (!strcmp(command, "inject")) manager = new(std::nothrow) injector_manager; - if (!strcmp(command, "info")) + else if (!strcmp(command, "info")) manager = new(std::nothrow) info_manager; - if (!strcmp(command, "loopback")) + else if (!strcmp(command, "loopback")) manager = new(std::nothrow) loopback_manager; if (!manager) { diff --git a/src/sensorctl/test_bench.h b/src/sensorctl/test_bench.h index 4e04b85..9f51622 100644 --- a/src/sensorctl/test_bench.h +++ b/src/sensorctl/test_bench.h @@ -67,6 +67,9 @@ do { \ } \ } while (0) +#define ASSERT_FREE(expr, X) \ + do { if (expr) { free (X); X = NULL; } } while (0) + #define ASSERT_TRUE(condition) ASSERT(condition, ==, true) #define ASSERT_FALSE(condition) ASSERT(condition, ==, false) #define ASSERT_EQ(left, right) ASSERT(left, ==, right) diff --git a/src/sensorctl/testcase/sensor_listener.cpp b/src/sensorctl/testcase/sensor_listener.cpp index ebff117..4626507 100644 --- a/src/sensorctl/testcase/sensor_listener.cpp +++ b/src/sensorctl/testcase/sensor_listener.cpp @@ -90,8 +90,8 @@ TESTCASE(sensor_listener, all_api_p_1) bool ret; int handle; sensor_t sensor; - sensor_t *list; - int count; + sensor_t *list = NULL; + int count = 0; called = false; @@ -102,29 +102,37 @@ TESTCASE(sensor_listener, all_api_p_1) ASSERT_EQ(err, 0); handle = sensord_connect(sensor); - ASSERT_EQ(err, 0); + ASSERT_FREE(((handle != 0) && list), list); + ASSERT_EQ(handle, 0); ret = sensord_register_event(handle, 1, 100, 100, event_cb, NULL); + ASSERT_FREE(((ret != true) && list), list); ASSERT_TRUE(ret); ret = sensord_start(handle, 0); + ASSERT_FREE(((ret != true) && list), list); ASSERT_TRUE(ret); ret = sensord_change_event_interval(handle, 0, 100); + ASSERT_FREE(((ret != true) && list), list); ASSERT_TRUE(ret); ret = sensord_change_event_max_batch_latency(handle, 0, 100); + ASSERT_FREE(((ret != true) && list), list); ASSERT_TRUE(ret); mainloop::run(); ret = sensord_stop(handle); + ASSERT_FREE(((ret != true) && list), list); ASSERT_TRUE(ret); ret = sensord_unregister_event(handle, 1); + ASSERT_FREE(((ret != true) && list), list); ASSERT_TRUE(ret); ret = sensord_disconnect(handle); + ASSERT_FREE(((ret != true) && list), list); ASSERT_TRUE(ret); free(list); diff --git a/src/sensorctl/testcase/sensor_provider.cpp b/src/sensorctl/testcase/sensor_provider.cpp index 9c76c21..a163325 100644 --- a/src/sensorctl/testcase/sensor_provider.cpp +++ b/src/sensorctl/testcase/sensor_provider.cpp @@ -86,8 +86,8 @@ static void add_mysensor(void) sensord_provider_set_resolution(provider, 0.01f); sensord_add_provider(provider); - sensord_remove_provider(provider); + sensord_destroy_provider(provider); } diff --git a/src/server/server_channel_handler.cpp b/src/server/server_channel_handler.cpp index ff66ec3..149c32e 100644 --- a/src/server/server_channel_handler.cpp +++ b/src/server/server_channel_handler.cpp @@ -141,13 +141,18 @@ int server_channel_handler::listener_connect(channel *ch, message &msg) msg.disclose((char *)&buf); - sensor_listener_proxy *listener; + sensor_listener_proxy *listener = NULL; listener = new(std::nothrow) sensor_listener_proxy(listener_id, buf.sensor, m_manager, ch); retvm_if(!listener, OP_ERROR, "Failed to allocate memory"); - retvm_if(!has_privileges(ch->get_fd(), listener->get_required_privileges()), - -EACCES, "Permission denied[%d, %s]", - listener_id, m_listeners[listener_id]->get_required_privileges().c_str()); + + if (!has_privileges(ch->get_fd(), listener->get_required_privileges())) { + delete listener; + listener = NULL; + _E("Permission denied[%d, %s]", listener_id, + m_listeners[listener_id]->get_required_privileges().c_str()); + return -EACCES; + } buf.listener_id = listener_id; @@ -155,8 +160,10 @@ int server_channel_handler::listener_connect(channel *ch, message &msg) reply.enclose((const char *)&buf, sizeof(buf)); reply.header()->err = OP_SUCCESS; - if (!ch->send_sync(&reply)) + if (!ch->send_sync(&reply)) { + delete listener; return OP_ERROR; + } _I("Connected sensor_listener[fd(%d) -> id(%u)]", ch->get_fd(), listener_id); m_listeners[listener_id] = listener; diff --git a/src/shared/message.cpp b/src/shared/message.cpp index d7455eb..6bffc8c 100644 --- a/src/shared/message.cpp +++ b/src/shared/message.cpp @@ -38,6 +38,9 @@ message::message(size_t capacity) m_header.type = UNDEFINED_TYPE; m_header.length = m_size; m_header.err = 0; + + for (int i = 0; i < MAX_HEADER_RESERVED; ++i) + m_header.ancillary[i] = NULL; } message::message(const void *msg, size_t sz) @@ -50,6 +53,9 @@ message::message(const void *msg, size_t sz) m_header.type = UNDEFINED_TYPE; m_header.length = m_size; m_header.err = 0; + + for (int i = 0; i < MAX_HEADER_RESERVED; ++i) + m_header.ancillary[i] = NULL; } message::message(const message &msg) @@ -72,6 +78,9 @@ message::message(int error) m_header.type = UNDEFINED_TYPE; m_header.length = 0; m_header.err = error; + + for (int i = 0; i < MAX_HEADER_RESERVED; ++i) + m_header.ancillary[i] = NULL; } message::~message() -- 2.7.4 From 49a82b2acc6128020b22ba4d88659c8cf2200b67 Mon Sep 17 00:00:00 2001 From: Abhishek Vijay Date: Tue, 3 Apr 2018 15:05:08 +0530 Subject: [PATCH 16/16] [Coverity Fixes][Sensord] Change-Id: Ida5323bd01436c4ea19674f4fe7e8d9307e97794 Signed-off-by: Abhishek Vijay --- src/sensorctl/sensor_adapter.cpp | 6 +++++- src/sensorctl/testcase/sensor_listener.cpp | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sensorctl/sensor_adapter.cpp b/src/sensorctl/sensor_adapter.cpp index 7deec68..2ba6f59 100644 --- a/src/sensorctl/sensor_adapter.cpp +++ b/src/sensorctl/sensor_adapter.cpp @@ -53,14 +53,18 @@ bool sensor_adapter::get_handle(sensor_info info, int &handle) { int err; int count; - sensor_t *sensors; + sensor_t *sensors = NULL; err = sensord_get_sensors(info.type, &sensors, &count); ASSERT_EQ(err, 0); handle = sensord_connect(sensors[info.index]); + ASSERT_FREE((handle < 0), sensors); ASSERT_GE(handle, 0); + free(sensors); + sensors = NULL; + return true; } diff --git a/src/sensorctl/testcase/sensor_listener.cpp b/src/sensorctl/testcase/sensor_listener.cpp index 4626507..cd1833c 100644 --- a/src/sensorctl/testcase/sensor_listener.cpp +++ b/src/sensorctl/testcase/sensor_listener.cpp @@ -59,6 +59,7 @@ TESTCASE(sensor_listener, get_sensors_p_1) err = sensord_get_sensors(ACCELEROMETER_SENSOR, &sensors, &count); ASSERT_EQ(err, 0); + ASSERT_FREE((count < 0), sensors); ASSERT_GT(count, 0); free(sensors); -- 2.7.4