aboutsummaryrefslogtreecommitdiffstats
path: root/libsensors
diff options
context:
space:
mode:
authorChristian Balster <christian.balster@gmail.com>2015-06-15 21:10:09 +0200
committerAndreas Blaesius <skate4life@gmx.de>2015-08-15 14:22:24 -0700
commit469a3ddad4fc39451250b3bf5b8417c3ca930289 (patch)
tree633ff1a2c808bf7ecbb522ba1e6a46fda9fea982 /libsensors
parentf3ef9365e9c5e902cde345826a8260bba05a2676 (diff)
downloaddevice_samsung_espressowifi-469a3ddad4fc39451250b3bf5b8417c3ca930289.zip
device_samsung_espressowifi-469a3ddad4fc39451250b3bf5b8417c3ca930289.tar.gz
device_samsung_espressowifi-469a3ddad4fc39451250b3bf5b8417c3ca930289.tar.bz2
espresso-common: libsensors: fix buffer overflows
long/int can't hold timestamp values in ns, use int64_t instead Change-Id: Id3e08a45aa556d8858b8b57d03c3b737e999772d
Diffstat (limited to 'libsensors')
-rw-r--r--libsensors/bh1721.c6
-rw-r--r--libsensors/bma250.c11
-rw-r--r--libsensors/geomagneticd/geomagneticd.h10
-rw-r--r--libsensors/geomagneticd/input.c16
-rw-r--r--libsensors/gp2a_light.c6
-rw-r--r--libsensors/gp2a_proximity.c4
-rw-r--r--libsensors/input.c16
-rw-r--r--libsensors/orientationd/input.c16
-rw-r--r--libsensors/orientationd/orientationd.c6
-rw-r--r--libsensors/orientationd/orientationd.h12
-rw-r--r--libsensors/piranha_sensors.c4
-rw-r--r--libsensors/piranha_sensors.h12
-rw-r--r--libsensors/yas530.c11
-rw-r--r--libsensors/yas_orientation.c11
14 files changed, 72 insertions, 69 deletions
diff --git a/libsensors/bh1721.c b/libsensors/bh1721.c
index 34d4594..9af7b3e 100644
--- a/libsensors/bh1721.c
+++ b/libsensors/bh1721.c
@@ -150,19 +150,19 @@ int bh1721_deactivate(struct piranha_sensors_handlers *handlers)
return 0;
}
-int bh1721_set_delay(struct piranha_sensors_handlers *handlers, long int delay)
+int bh1721_set_delay(struct piranha_sensors_handlers *handlers, int64_t delay)
{
struct bh1721_data *data;
int rc;
- ALOGD("%s(%p, %ld)", __func__, handlers, delay);
+ ALOGD("%s(%p, %" PRId64 ")", __func__, handlers, delay);
if (handlers == NULL || handlers->data == NULL)
return -EINVAL;
data = (struct bh1721_data *) handlers->data;
- rc = sysfs_value_write(data->path_delay, (int) delay);
+ rc = sysfs_value_write(data->path_delay, delay);
if (rc < 0) {
ALOGE("%s: Unable to write sysfs value", __func__);
return -1;
diff --git a/libsensors/bma250.c b/libsensors/bma250.c
index 91d7fc0..681b1dd 100644
--- a/libsensors/bma250.c
+++ b/libsensors/bma250.c
@@ -152,13 +152,12 @@ int bma250_deactivate(struct piranha_sensors_handlers *handlers)
return 0;
}
-int bma250_set_delay(struct piranha_sensors_handlers *handlers, long int delay)
+int bma250_set_delay(struct piranha_sensors_handlers *handlers, int64_t delay)
{
struct bma250_data *data;
- int d;
int rc;
- ALOGD("%s(%p, %ld)", __func__, handlers, delay);
+ ALOGD("%s(%p, %" PRId64 ")", __func__, handlers, delay);
if (handlers == NULL || handlers->data == NULL)
return -EINVAL;
@@ -166,11 +165,11 @@ int bma250_set_delay(struct piranha_sensors_handlers *handlers, long int delay)
data = (struct bma250_data *) handlers->data;
if (delay < 10000000)
- d = 10;
+ delay = 10;
else
- d = delay / 1000000;
+ delay /= 1000000;
- rc = sysfs_value_write(data->path_delay, d);
+ rc = sysfs_value_write(data->path_delay, delay);
if (rc < 0) {
ALOGE("%s: Unable to write sysfs value", __func__);
return -1;
diff --git a/libsensors/geomagneticd/geomagneticd.h b/libsensors/geomagneticd/geomagneticd.h
index cd57eb9..72afbc4 100644
--- a/libsensors/geomagneticd/geomagneticd.h
+++ b/libsensors/geomagneticd/geomagneticd.h
@@ -18,6 +18,8 @@
#include <stdint.h>
#include <poll.h>
#include <linux/input.h>
+#define __STDC_FORMAT_MACROS
+#include <inttypes.h>
#include <hardware/sensors.h>
#include <hardware/hardware.h>
@@ -45,14 +47,14 @@ struct geomagneticd_data {
*/
void input_event_set(struct input_event *event, int type, int code, int value);
-long int timestamp(struct timeval *time);
-long int input_timestamp(struct input_event *event);
+int64_t timestamp(struct timeval *time);
+int64_t input_timestamp(struct input_event *event);
int uinput_rel_create(const char *name);
void uinput_destroy(int uinput_fd);
int input_open(char *name);
int sysfs_path_prefix(char *name, char *path_prefix);
-int sysfs_value_read(char *path);
-int sysfs_value_write(char *path, int value);
+int64_t sysfs_value_read(char *path);
+int sysfs_value_write(char *path, int64_t value);
int sysfs_string_read(char *path, char *buffer, size_t length);
int sysfs_string_write(char *path, char *buffer, size_t length);
diff --git a/libsensors/geomagneticd/input.c b/libsensors/geomagneticd/input.c
index 7e9ca4a..3aedd05 100644
--- a/libsensors/geomagneticd/input.c
+++ b/libsensors/geomagneticd/input.c
@@ -44,15 +44,15 @@ void input_event_set(struct input_event *event, int type, int code, int value)
gettimeofday(&event->time, NULL);
}
-long int timestamp(struct timeval *time)
+int64_t timestamp(struct timeval *time)
{
if (time == NULL)
return -1;
- return time->tv_sec * 1000000000LL + time->tv_usec * 1000;
+ return (int64_t) (time->tv_sec * 1000000000LL + time->tv_usec * 1000);
}
-long int input_timestamp(struct input_event *event)
+int64_t input_timestamp(struct input_event *event)
{
if (event == NULL)
return -1;
@@ -213,10 +213,10 @@ int sysfs_path_prefix(char *name, char *path_prefix)
return -1;
}
-int sysfs_value_read(char *path)
+int64_t sysfs_value_read(char *path)
{
char buffer[100];
- int value;
+ int64_t value;
int fd = -1;
int rc;
@@ -231,7 +231,7 @@ int sysfs_value_read(char *path)
if (rc <= 0)
goto error;
- value = atoi(buffer);
+ value = (int64_t)strtoimax(buffer, NULL, 10);
goto complete;
error:
@@ -244,7 +244,7 @@ complete:
return value;
}
-int sysfs_value_write(char *path, int value)
+int sysfs_value_write(char *path, int64_t value)
{
char buffer[100];
int fd = -1;
@@ -257,7 +257,7 @@ int sysfs_value_write(char *path, int value)
if (fd < 0)
goto error;
- snprintf((char *) &buffer, sizeof(buffer), "%d\n", value);
+ snprintf((char *) &buffer, sizeof(buffer), "%" PRId64 "\n", value);
rc = write(fd, buffer, strlen(buffer));
if (rc < (int) strlen(buffer))
diff --git a/libsensors/gp2a_light.c b/libsensors/gp2a_light.c
index 3a41187..c82cb09 100644
--- a/libsensors/gp2a_light.c
+++ b/libsensors/gp2a_light.c
@@ -150,19 +150,19 @@ int gp2a_light_deactivate(struct piranha_sensors_handlers *handlers)
return 0;
}
-int gp2a_light_set_delay(struct piranha_sensors_handlers *handlers, long int delay)
+int gp2a_light_set_delay(struct piranha_sensors_handlers *handlers, int64_t delay)
{
struct gp2a_light_data *data;
int rc;
- ALOGD("%s(%p, %ld)", __func__, handlers, delay);
+ ALOGD("%s(%p, %" PRId64 ")", __func__, handlers, delay);
if (handlers == NULL || handlers->data == NULL)
return -EINVAL;
data = (struct gp2a_light_data *) handlers->data;
- rc = sysfs_value_write(data->path_delay, (int) delay);
+ rc = sysfs_value_write(data->path_delay, delay);
if (rc < 0) {
ALOGE("%s: Unable to write sysfs value", __func__);
return -1;
diff --git a/libsensors/gp2a_proximity.c b/libsensors/gp2a_proximity.c
index b2c9813..5cfd8dd 100644
--- a/libsensors/gp2a_proximity.c
+++ b/libsensors/gp2a_proximity.c
@@ -147,9 +147,9 @@ int gp2a_proximity_deactivate(struct piranha_sensors_handlers *handlers)
return 0;
}
-int gp2a_proximity_set_delay(struct piranha_sensors_handlers *handlers, long int delay)
+int gp2a_proximity_set_delay(struct piranha_sensors_handlers *handlers, int64_t delay)
{
- ALOGD("%s(%p, %ld)", __func__, handlers, delay);
+ ALOGD("%s(%p, %" PRId64 ")", __func__, handlers, delay);
return 0;
}
diff --git a/libsensors/input.c b/libsensors/input.c
index c48f17f..96ac117 100644
--- a/libsensors/input.c
+++ b/libsensors/input.c
@@ -44,15 +44,15 @@ void input_event_set(struct input_event *event, int type, int code, int value)
gettimeofday(&event->time, NULL);
}
-long int timestamp(struct timeval *time)
+int64_t timestamp(struct timeval *time)
{
if (time == NULL)
return -1;
- return time->tv_sec * 1000000000LL + time->tv_usec * 1000;
+ return (int64_t) (time->tv_sec * 1000000000LL + time->tv_usec * 1000);
}
-long int input_timestamp(struct input_event *event)
+int64_t input_timestamp(struct input_event *event)
{
if (event == NULL)
return -1;
@@ -213,10 +213,10 @@ int sysfs_path_prefix(char *name, char *path_prefix)
return -1;
}
-int sysfs_value_read(char *path)
+int64_t sysfs_value_read(char *path)
{
char buffer[100];
- int value;
+ int64_t value;
int fd = -1;
int rc;
@@ -231,7 +231,7 @@ int sysfs_value_read(char *path)
if (rc <= 0)
goto error;
- value = atoi(buffer);
+ value = (int64_t)strtoimax(buffer, NULL, 10);
goto complete;
error:
@@ -244,7 +244,7 @@ complete:
return value;
}
-int sysfs_value_write(char *path, int value)
+int sysfs_value_write(char *path, int64_t value)
{
char buffer[100];
int fd = -1;
@@ -257,7 +257,7 @@ int sysfs_value_write(char *path, int value)
if (fd < 0)
goto error;
- snprintf((char *) &buffer, sizeof(buffer), "%d\n", value);
+ snprintf((char *) &buffer, sizeof(buffer), "%" PRId64 "\n", value);
rc = write(fd, buffer, strlen(buffer));
if (rc < (int) strlen(buffer))
diff --git a/libsensors/orientationd/input.c b/libsensors/orientationd/input.c
index 1afa2b8..f138cfc 100644
--- a/libsensors/orientationd/input.c
+++ b/libsensors/orientationd/input.c
@@ -44,15 +44,15 @@ void input_event_set(struct input_event *event, int type, int code, int value)
gettimeofday(&event->time, NULL);
}
-long int timestamp(struct timeval *time)
+int64_t timestamp(struct timeval *time)
{
if (time == NULL)
return -1;
- return time->tv_sec * 1000000000LL + time->tv_usec * 1000;
+ return (int64_t) (time->tv_sec * 1000000000LL + time->tv_usec * 1000);
}
-long int input_timestamp(struct input_event *event)
+int64_t input_timestamp(struct input_event *event)
{
if (event == NULL)
return -1;
@@ -213,10 +213,10 @@ int sysfs_path_prefix(char *name, char *path_prefix)
return -1;
}
-int sysfs_value_read(char *path)
+int64_t sysfs_value_read(char *path)
{
char buffer[100];
- int value;
+ int64_t value;
int fd = -1;
int rc;
@@ -231,7 +231,7 @@ int sysfs_value_read(char *path)
if (rc <= 0)
goto error;
- value = atoi(buffer);
+ value = (int64_t)strtoimax(buffer, NULL, 10);
goto complete;
error:
@@ -244,7 +244,7 @@ complete:
return value;
}
-int sysfs_value_write(char *path, int value)
+int sysfs_value_write(char *path, int64_t value)
{
char buffer[100];
int fd = -1;
@@ -257,7 +257,7 @@ int sysfs_value_write(char *path, int value)
if (fd < 0)
goto error;
- snprintf((char *) &buffer, sizeof(buffer), "%d\n", value);
+ snprintf((char *) &buffer, sizeof(buffer), "%" PRId64 "\n", value);
rc = write(fd, buffer, strlen(buffer));
if (rc < (int) strlen(buffer))
diff --git a/libsensors/orientationd/orientationd.c b/libsensors/orientationd/orientationd.c
index 8ad84c5..fb2925b 100644
--- a/libsensors/orientationd/orientationd.c
+++ b/libsensors/orientationd/orientationd.c
@@ -95,8 +95,8 @@ void *orientationd_thread(void *thread_data)
struct orientationd_data *data;
struct input_event event;
struct timeval time;
- long int before, after;
- int diff;
+ int64_t before, after;
+ useconds_t diff;
int input_fd;
int rc;
@@ -137,7 +137,7 @@ next:
gettimeofday(&time, NULL);
after = timestamp(&time);
- diff = (int) (data->delay * 1000000 - (after - before)) / 1000;
+ diff = (useconds_t) (data->delay * 1000000 - (after - before)) / 1000;
if (diff <= 0)
continue;
diff --git a/libsensors/orientationd/orientationd.h b/libsensors/orientationd/orientationd.h
index 7e169e4..1eebd90 100644
--- a/libsensors/orientationd/orientationd.h
+++ b/libsensors/orientationd/orientationd.h
@@ -18,6 +18,8 @@
#include <stdint.h>
#include <poll.h>
#include <linux/input.h>
+#define __STDC_FORMAT_MACROS
+#include <inttypes.h>
#include <hardware/sensors.h>
#include <hardware/hardware.h>
@@ -47,7 +49,7 @@ struct orientationd_data {
sensors_vec_t acceleration;
sensors_vec_t magnetic;
- unsigned int delay;
+ int64_t delay;
int input_fd;
int activated;
@@ -65,14 +67,14 @@ extern int orientationd_handlers_count;
*/
void input_event_set(struct input_event *event, int type, int code, int value);
-long int timestamp(struct timeval *time);
-long int input_timestamp(struct input_event *event);
+int64_t timestamp(struct timeval *time);
+int64_t input_timestamp(struct input_event *event);
int uinput_rel_create(const char *name);
void uinput_destroy(int uinput_fd);
int input_open(char *name);
int sysfs_path_prefix(char *name, char *path_prefix);
-int sysfs_value_read(char *path);
-int sysfs_value_write(char *path, int value);
+int64_t sysfs_value_read(char *path);
+int sysfs_value_write(char *path, int64_t value);
int sysfs_string_read(char *path, char *buffer, size_t length);
int sysfs_string_write(char *path, char *buffer, size_t length);
diff --git a/libsensors/piranha_sensors.c b/libsensors/piranha_sensors.c
index 0def2e5..7c5ce6f 100644
--- a/libsensors/piranha_sensors.c
+++ b/libsensors/piranha_sensors.c
@@ -127,7 +127,7 @@ int piranha_sensors_set_delay(struct sensors_poll_device_t *dev, int handle,
struct piranha_sensors_device *device;
int i;
- ALOGD("%s(%p, %d, %ld)", __func__, dev, handle, (long int) ns);
+ ALOGD("%s(%p, %d, %" PRId64 ")", __func__, dev, handle, ns);
if (dev == NULL)
return -EINVAL;
@@ -142,7 +142,7 @@ int piranha_sensors_set_delay(struct sensors_poll_device_t *dev, int handle,
continue;
if (device->handlers[i]->handle == handle && device->handlers[i]->set_delay != NULL)
- return device->handlers[i]->set_delay(device->handlers[i], (long int) ns);
+ return device->handlers[i]->set_delay(device->handlers[i], ns);
}
return 0;
diff --git a/libsensors/piranha_sensors.h b/libsensors/piranha_sensors.h
index 4de8c99..876aaec 100644
--- a/libsensors/piranha_sensors.h
+++ b/libsensors/piranha_sensors.h
@@ -18,6 +18,8 @@
#include <stdint.h>
#include <poll.h>
#include <linux/input.h>
+#define __STDC_FORMAT_MACROS
+#include <inttypes.h>
#include <hardware/sensors.h>
#include <hardware/hardware.h>
@@ -40,7 +42,7 @@ struct piranha_sensors_handlers {
int (*activate)(struct piranha_sensors_handlers *handlers);
int (*deactivate)(struct piranha_sensors_handlers *handlers);
int (*set_delay)(struct piranha_sensors_handlers *handlers,
- long int delay);
+ int64_t delay);
int (*get_data)(struct piranha_sensors_handlers *handlers,
struct sensors_event_t *event);
@@ -76,14 +78,14 @@ int piranha_sensors_poll(struct sensors_poll_device_t *dev,
*/
void input_event_set(struct input_event *event, int type, int code, int value);
-long int timestamp(struct timeval *time);
-long int input_timestamp(struct input_event *event);
+int64_t timestamp(struct timeval *time);
+int64_t input_timestamp(struct input_event *event);
int uinput_rel_create(const char *name);
void uinput_destroy(int uinput_fd);
int input_open(char *name);
int sysfs_path_prefix(char *name, char *path_prefix);
-int sysfs_value_read(char *path);
-int sysfs_value_write(char *path, int value);
+int64_t sysfs_value_read(char *path);
+int sysfs_value_write(char *path, int64_t value);
int sysfs_string_read(char *path, char *buffer, size_t length);
int sysfs_string_write(char *path, char *buffer, size_t length);
diff --git a/libsensors/yas530.c b/libsensors/yas530.c
index 81ff60d..b9b0e91 100644
--- a/libsensors/yas530.c
+++ b/libsensors/yas530.c
@@ -152,13 +152,12 @@ int yas530_deactivate(struct piranha_sensors_handlers *handlers)
return 0;
}
-int yas530_set_delay(struct piranha_sensors_handlers *handlers, long int delay)
+int yas530_set_delay(struct piranha_sensors_handlers *handlers, int64_t delay)
{
struct yas530_data *data;
- int d;
int rc;
- ALOGD("%s(%p, %ld)", __func__, handlers, delay);
+ ALOGD("%s(%p, %" PRId64 ")", __func__, handlers, delay);
if (handlers == NULL || handlers->data == NULL)
return -EINVAL;
@@ -166,11 +165,11 @@ int yas530_set_delay(struct piranha_sensors_handlers *handlers, long int delay)
data = (struct yas530_data *) handlers->data;
if (delay < 10000000)
- d = 10;
+ delay = 10;
else
- d = delay / 1000000;
+ delay /= 1000000;
- rc = sysfs_value_write(data->path_delay, d);
+ rc = sysfs_value_write(data->path_delay, delay);
if (rc < 0) {
ALOGE("%s: Unable to write sysfs value", __func__);
return -1;
diff --git a/libsensors/yas_orientation.c b/libsensors/yas_orientation.c
index 3668d8b..c14ed72 100644
--- a/libsensors/yas_orientation.c
+++ b/libsensors/yas_orientation.c
@@ -191,13 +191,12 @@ int yas_orientation_deactivate(struct piranha_sensors_handlers *handlers)
return 0;
}
-int yas_orientation_set_delay(struct piranha_sensors_handlers *handlers, long int delay)
+int yas_orientation_set_delay(struct piranha_sensors_handlers *handlers, int64_t delay)
{
struct yas_orientation_data *data;
- int d;
int rc;
- ALOGD("%s(%p, %ld)", __func__, handlers, delay);
+ ALOGD("%s(%p, %" PRId64 ")", __func__, handlers, delay);
if (handlers == NULL || handlers->data == NULL)
return -EINVAL;
@@ -214,11 +213,11 @@ int yas_orientation_set_delay(struct piranha_sensors_handlers *handlers, long in
data->magnetic_sensor->set_delay(data->magnetic_sensor, delay);
if (delay < 10000000)
- d = 10;
+ delay = 10;
else
- d = delay / 1000000;
+ delay /= 1000000;
- rc = sysfs_value_write(data->path_delay, d);
+ rc = sysfs_value_write(data->path_delay, delay);
if (rc < 0) {
ALOGE("%s: Unable to write sysfs value", __func__);
return -1;