From 757f2d4900dd268b0b82b5418f0b9483d8c00cc6 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 12 Feb 2020 22:05:33 +1000 Subject: [PATCH] Drop the mt_sync_state in our device struct Replace it with a stack-allocated one. This saves us a bunch of confusing allocations and size calculations. And in the process use uint32_t/int32_t to ensure the struct is actually the expected size. Signed-off-by: Peter Hutterer --- libevdev/libevdev-int.h | 7 ------- libevdev/libevdev.c | 31 +++++++++++++------------------ 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/libevdev/libevdev-int.h b/libevdev/libevdev-int.h index ee834db..ec8e48b 100644 --- a/libevdev/libevdev-int.h +++ b/libevdev/libevdev-int.h @@ -55,11 +55,6 @@ enum SyncState { SYNC_IN_PROGRESS, }; -struct mt_sync_state { - int code; - int val[]; -}; - /** * Internal only: log data used to send messages to the respective log * handler. We re-use the same struct for a global and inside @@ -113,8 +108,6 @@ struct libevdev { struct timeval last_event_time; struct { - struct mt_sync_state *mt_state; - size_t mt_state_sz; /* in bytes */ unsigned long *slot_update; size_t slot_update_sz; /* in bytes */ unsigned long *tracking_id_changes; diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index 14ada21..a91878d 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "libevdev.h" @@ -199,7 +200,6 @@ libevdev_reset(struct libevdev *dev) free(dev->phys); free(dev->uniq); free(dev->mt_slot_vals); - free(dev->mt_sync.mt_state); free(dev->mt_sync.tracking_id_changes); free(dev->mt_sync.slot_update); memset(dev, 0, sizeof(*dev)); @@ -333,11 +333,9 @@ free_slots(struct libevdev *dev) free(dev->mt_slot_vals); free(dev->mt_sync.tracking_id_changes); free(dev->mt_sync.slot_update); - free(dev->mt_sync.mt_state); dev->mt_slot_vals = NULL; dev->mt_sync.tracking_id_changes = NULL; dev->mt_sync.slot_update = NULL; - dev->mt_sync.mt_state = NULL; } static int @@ -349,11 +347,9 @@ init_slots(struct libevdev *dev) free(dev->mt_slot_vals); free(dev->mt_sync.tracking_id_changes); free(dev->mt_sync.slot_update); - free(dev->mt_sync.mt_state); dev->mt_slot_vals = NULL; dev->mt_sync.tracking_id_changes = NULL; dev->mt_sync.slot_update = NULL; - dev->mt_sync.mt_state = NULL; /* devices with ABS_RESERVED aren't MT devices, see the documentation for multitouch-related @@ -377,10 +373,6 @@ init_slots(struct libevdev *dev) } dev->current_slot = abs_info->value; - dev->mt_sync.mt_state_sz = sizeof(*dev->mt_sync.mt_state) + - (dev->num_slots) * sizeof(int); - dev->mt_sync.mt_state = calloc(1, dev->mt_sync.mt_state_sz); - dev->mt_sync.tracking_id_changes_sz = NLONGS(dev->num_slots) * sizeof(long); dev->mt_sync.tracking_id_changes = malloc(dev->mt_sync.tracking_id_changes_sz); @@ -388,8 +380,7 @@ init_slots(struct libevdev *dev) dev->mt_sync.slot_update = malloc(dev->mt_sync.slot_update_sz); if (!dev->mt_sync.tracking_id_changes || - !dev->mt_sync.slot_update || - !dev->mt_sync.mt_state) { + !dev->mt_sync.slot_update) { rc = -ENOMEM; goto out; } @@ -691,7 +682,6 @@ sync_mt_state(struct libevdev *dev, int create_events) int rc; int axis, slot; int last_reported_slot = 0; - struct mt_sync_state *mt_state = dev->mt_sync.mt_state; unsigned long *slot_update = dev->mt_sync.slot_update; unsigned long *tracking_id_changes = dev->mt_sync.tracking_id_changes; int need_tracking_id_changes = 0; @@ -703,30 +693,35 @@ sync_mt_state(struct libevdev *dev, int create_events) #define AXISBIT(_slot, _axis) (_slot * ABS_MT_CNT + _axis - ABS_MT_MIN) for (axis = ABS_MT_MIN; axis <= ABS_MT_MAX; axis++) { + /* EVIOCGMTSLOTS required format */ + struct mt_sync_state { + uint32_t code; + int32_t val[dev->num_slots]; + } mt_state; + if (axis == ABS_MT_SLOT) continue; if (!libevdev_has_event_code(dev, EV_ABS, axis)) continue; - mt_state->code = axis; - rc = ioctl(dev->fd, EVIOCGMTSLOTS(dev->mt_sync.mt_state_sz), mt_state); + mt_state.code = axis; + rc = ioctl(dev->fd, EVIOCGMTSLOTS(sizeof(mt_state)), &mt_state); if (rc < 0) goto out; for (slot = 0; slot < dev->num_slots; slot++) { - - if (*slot_value(dev, slot, axis) == mt_state->val[slot]) + if (*slot_value(dev, slot, axis) == mt_state.val[slot]) continue; if (axis == ABS_MT_TRACKING_ID && *slot_value(dev, slot, axis) != -1 && - mt_state->val[slot] != -1) { + mt_state.val[slot] != -1) { set_bit(tracking_id_changes, slot); need_tracking_id_changes = 1; } - *slot_value(dev, slot, axis) = mt_state->val[slot]; + *slot_value(dev, slot, axis) = mt_state.val[slot]; set_bit(slot_update, AXISBIT(slot, axis)); /* note that this slot has updates */ -- 2.34.1