From 45009fb7f5dc9a60d6be0fbedeb20dacdb265c56 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 28 Nov 2023 15:59:34 +1000 Subject: [PATCH] dix: clean up the GestureInfoRec on device close Direct leak of 1080 byte(s) in 3 object(s) allocated from: #0 0x7f00a4ed8cc7 in calloc (/lib64/libasan.so.8+0xd8cc7) (BuildId: 6f17f87dc4c1aa9f9dde7c4856604c3a25ba4872) #1 0x59f740 in InitGestureClassDeviceStruct ../dix/devices.c:1692 #2 0x418a0b in xwl_pointer_proc_pointer_gestures ../hw/xwayland/xwayland-input.c:325 #3 0x598e5c in ActivateDevice ../dix/devices.c:578 #4 0x420207 in init_pointer_gestures_device ../hw/xwayland/xwayland-input.c:1677 #5 0x420bf1 in seat_handle_capabilities ../hw/xwayland/xwayland-input.c:1801 #6 0x7f00a4145055 in ffi_call_unix64 (/lib64/libffi.so.8+0x9055) (BuildId: 308041eea4a8d89d9265d3c24b7261dfbe44a61e) Acked-by: Olivier Fourdan --- dix/devices.c | 9 +++++++++ dix/gestures.c | 6 ++++++ include/input.h | 1 + 3 files changed, 16 insertions(+) diff --git a/dix/devices.c b/dix/devices.c index 7150734a5..b063128df 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -827,6 +827,14 @@ FreeDeviceClass(int type, void **class) free((*t)); break; } + case XIGestureClass: + { + GestureClassPtr *g = (GestureClassPtr *) class; + + GestureFreeGestureInfo(&(*g)->gesture); + free((*g)); + break; + } case FocusClass: { FocusClassPtr *f = (FocusClassPtr *) class; @@ -941,6 +949,7 @@ FreeAllDeviceClasses(ClassesPtr classes) FreeDeviceClass(ButtonClass, (void *) &classes->button); FreeDeviceClass(FocusClass, (void *) &classes->focus); FreeDeviceClass(ProximityClass, (void *) &classes->proximity); + FreeDeviceClass(XIGestureClass, (void*) &classes->gesture); FreeFeedbackClass(KbdFeedbackClass, (void *) &classes->kbdfeed); FreeFeedbackClass(PtrFeedbackClass, (void *) &classes->ptrfeed); diff --git a/dix/gestures.c b/dix/gestures.c index 593a4a67f..43672ace5 100644 --- a/dix/gestures.c +++ b/dix/gestures.c @@ -58,6 +58,12 @@ GestureInitGestureInfo(GestureInfoPtr gi) return TRUE; } +void +GestureFreeGestureInfo(GestureInfoPtr gi) +{ + free(gi->sprite.spriteTrace); +} + /** * Given an event type returns the associated gesture event info. */ diff --git a/include/input.h b/include/input.h index f50c9524b..75c7c2df6 100644 --- a/include/input.h +++ b/include/input.h @@ -666,6 +666,7 @@ extern void TouchEmitTouchEnd(DeviceIntPtr dev, TouchPointInfoPtr ti, int flags, extern void TouchAcceptAndEnd(DeviceIntPtr dev, int touchid); extern Bool GestureInitGestureInfo(GestureInfoPtr gesture); +extern void GestureFreeGestureInfo(GestureInfoPtr gesture); extern GestureInfoPtr GestureBeginGesture(DeviceIntPtr dev, InternalEvent *ev); extern GestureInfoPtr GestureFindActiveByEventType(DeviceIntPtr dev, int type); extern void GestureEndGesture(GestureInfoPtr gi);