[PATCH 4/4] dix: Resize touch event history if the array is filled up

Timo Aaltonen tjaalton at ubuntu.com
Thu Mar 16 10:29:44 UTC 2017


From: Maarten Lankhorst <maarten.lankhorst at ubuntu.com>

Signed-off-by: Maarten Lankhorst <maarten.lankhorst at ubuntu.com>
---
 dix/touch.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/dix/touch.c b/dix/touch.c
index 37902bd..efc7ef9 100644
--- a/dix/touch.c
+++ b/dix/touch.c
@@ -430,11 +430,25 @@ TouchEventHistoryPush(TouchPointInfoPtr ti, const DeviceEvent *ev)
     if (ev->flags & (TOUCH_CLIENT_ID | TOUCH_REPLAYING))
         return;
 
+    if (ti->history_elements == ti->history_size - 1) {
+        DeviceEvent *hist = NULL;
+        size_t sz = ti->history_size * 2;
+
+        if (sz < 10000) {
+            hist = realloc(ti->history, sz * sizeof(*hist));
+
+            if (hist) {
+                ti->history = hist;
+                ti->history_size = sz;
+                memset(&hist[sz/2], 0, sizeof(*hist)*sz/2);
+            }
+        }
+    }
+
     ti->history[ti->history_elements++] = *ev;
-    /* FIXME: proper overflow fixes */
     if (ti->history_elements > ti->history_size - 1) {
         ti->history_elements = ti->history_size - 1;
-        DebugF("source device %d: history size %zu overflowing for touch %u\n",
+        ErrorF("source device %d: history size %zu overflowing for touch %u\n",
                ti->sourceid, ti->history_size, ti->client_id);
     }
 }
-- 
2.7.4



More information about the xorg-devel mailing list