diff options
author | Christian Balster <christian.balster@gmail.com> | 2015-06-15 21:10:09 +0200 |
---|---|---|
committer | Andreas Blaesius <skate4life@gmx.de> | 2015-08-15 14:22:24 -0700 |
commit | 469a3ddad4fc39451250b3bf5b8417c3ca930289 (patch) | |
tree | 633ff1a2c808bf7ecbb522ba1e6a46fda9fea982 /libsensors | |
parent | f3ef9365e9c5e902cde345826a8260bba05a2676 (diff) | |
download | device_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.c | 6 | ||||
-rw-r--r-- | libsensors/bma250.c | 11 | ||||
-rw-r--r-- | libsensors/geomagneticd/geomagneticd.h | 10 | ||||
-rw-r--r-- | libsensors/geomagneticd/input.c | 16 | ||||
-rw-r--r-- | libsensors/gp2a_light.c | 6 | ||||
-rw-r--r-- | libsensors/gp2a_proximity.c | 4 | ||||
-rw-r--r-- | libsensors/input.c | 16 | ||||
-rw-r--r-- | libsensors/orientationd/input.c | 16 | ||||
-rw-r--r-- | libsensors/orientationd/orientationd.c | 6 | ||||
-rw-r--r-- | libsensors/orientationd/orientationd.h | 12 | ||||
-rw-r--r-- | libsensors/piranha_sensors.c | 4 | ||||
-rw-r--r-- | libsensors/piranha_sensors.h | 12 | ||||
-rw-r--r-- | libsensors/yas530.c | 11 | ||||
-rw-r--r-- | libsensors/yas_orientation.c | 11 |
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; |