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 <ofourdan@redhat.com>
This commit is contained in:
Peter Hutterer 2023-11-28 15:59:34 +10:00
parent 83453fb51e
commit 45009fb7f5
3 changed files with 16 additions and 0 deletions

View File

@ -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);

View File

@ -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.
*/

View File

@ -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);