From 67ef0f083414e761785df9b72602ae23ac1d2ae3 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 4 Jan 2024 12:23:35 +1000 Subject: [PATCH] test: fix the touch tests to no longer leak Instead of hardcoded TouchRec/ValuatorRec init the devices with the matching functions and go from there. This allows us to clean them up later, removing the various leaks that stop asan from being happy. (cherry picked from commit e44e9262df8b50f76fec3cc371b785473090fb59) --- test/touch.c | 110 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 67 insertions(+), 43 deletions(-) diff --git a/test/touch.c b/test/touch.c index 7b22ceddb..1f183a72a 100644 --- a/test/touch.c +++ b/test/touch.c @@ -35,27 +35,46 @@ #include "tests-common.h" +static void +free_device(DeviceIntPtr dev) +{ + free(dev->name); + free(dev->last.scroll); /* sigh, allocated but not freed by the valuator functions */ + for (int i = 0; i < dev->last.num_touches; i++) + valuator_mask_free(&dev->last.touches[i].valuators); + + free(dev->last.touches); /* sigh, allocated but not freed by the valuator functions */ + FreeDeviceClass(XIValuatorClass, (void**)&dev->valuator); + FreeDeviceClass(XITouchClass, (void**)&dev->touch); +} + static void touch_grow_queue(void) { DeviceIntRec dev; - ValuatorClassRec val; - TouchClassRec touch; + SpriteInfoRec sprite; size_t size, new_size; int i; + ScreenRec screen; + Atom labels[2] = { 0 }; + + screenInfo.screens[0] = &screen; memset(&dev, 0, sizeof(dev)); + dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */ dev.name = xnfstrdup("test device"); dev.id = 2; - dev.valuator = &val; - val.numAxes = 5; - dev.touch = &touch; + + InitValuatorClassDeviceStruct(&dev, 2, labels, 10, Absolute); + InitTouchClassDeviceStruct(&dev, 5, XIDirectTouch, 2); + + memset(&sprite, 0, sizeof(sprite)); + dev.spriteInfo = &sprite; + inputInfo.devices = &dev; size = 5; - dev.last.num_touches = size; - dev.last.touches = calloc(dev.last.num_touches, sizeof(*dev.last.touches)); assert(dev.last.touches); for (i = 0; i < size; i++) { dev.last.touches[i].active = TRUE; @@ -91,27 +110,33 @@ touch_grow_queue(void) assert(t->ddx_id == 0); } - free(dev.name); + free_device(&dev); } static void touch_find_ddxid(void) { DeviceIntRec dev; + SpriteInfoRec sprite; DDXTouchPointInfoPtr ti, ti2; - ValuatorClassRec val; - TouchClassRec touch; int size = 5; int i; + Atom labels[2] = { 0 }; + ScreenRec screen; + + screenInfo.screens[0] = &screen; memset(&dev, 0, sizeof(dev)); + dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */ dev.name = xnfstrdup("test device"); dev.id = 2; - dev.valuator = &val; - val.numAxes = 5; - dev.touch = &touch; - dev.last.num_touches = size; - dev.last.touches = calloc(dev.last.num_touches, sizeof(*dev.last.touches)); + + InitValuatorClassDeviceStruct(&dev, 2, labels, 10, Absolute); + InitTouchClassDeviceStruct(&dev, 5, XIDirectTouch, 2); + + memset(&sprite, 0, sizeof(sprite)); + dev.spriteInfo = &sprite; + inputInfo.devices = &dev; assert(dev.last.touches); @@ -159,32 +184,35 @@ touch_find_ddxid(void) ti = TouchFindByDDXID(&dev, 40, TRUE); assert(ti == &dev.last.touches[size+1]); - free(dev.name); + free_device(&dev); } static void touch_begin_ddxtouch(void) { DeviceIntRec dev; + SpriteInfoRec sprite; DDXTouchPointInfoPtr ti; - ValuatorClassRec val; - TouchClassRec touch; int ddx_id = 123; unsigned int last_client_id = 0; - int size = 5; + Atom labels[2] = { 0 }; + ScreenRec screen; + + screenInfo.screens[0] = &screen; memset(&dev, 0, sizeof(dev)); + dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */ dev.name = xnfstrdup("test device"); dev.id = 2; - dev.valuator = &val; - val.numAxes = 5; - touch.mode = XIDirectTouch; - dev.touch = &touch; - dev.last.num_touches = size; - dev.last.touches = calloc(dev.last.num_touches, sizeof(*dev.last.touches)); inputInfo.devices = &dev; - assert(dev.last.touches); + InitValuatorClassDeviceStruct(&dev, 2, labels, 10, Absolute); + InitTouchClassDeviceStruct(&dev, 5, XIDirectTouch, 2); + + memset(&sprite, 0, sizeof(sprite)); + dev.spriteInfo = &sprite; + + assert(dev.last.touches); ti = TouchBeginDDXTouch(&dev, ddx_id); assert(ti); assert(ti->ddx_id == ddx_id); @@ -206,41 +234,36 @@ touch_begin_ddxtouch(void) assert(!ti->emulate_pointer); last_client_id = ti->client_id; - free(dev.name); + free_device(&dev); } static void touch_begin_touch(void) { DeviceIntRec dev; - TouchClassRec touch; - ValuatorClassRec val; TouchPointInfoPtr ti; int touchid = 12434; int sourceid = 23; SpriteInfoRec sprite; ScreenRec screen; + Atom labels[2] = { 0 }; screenInfo.screens[0] = &screen; memset(&dev, 0, sizeof(dev)); + dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */ dev.name = xnfstrdup("test device"); dev.id = 2; - memset(&sprite, 0, sizeof(sprite)); - dev.spriteInfo = &sprite; - - memset(&touch, 0, sizeof(touch)); - touch.num_touches = 0; - - memset(&val, 0, sizeof(val)); - dev.valuator = &val; - val.numAxes = 2; - ti = TouchBeginTouch(&dev, sourceid, touchid, TRUE); assert(!ti); - dev.touch = &touch; + InitValuatorClassDeviceStruct(&dev, 2, labels, 10, Absolute); + InitTouchClassDeviceStruct(&dev, 5, XIDirectTouch, 2); + + memset(&sprite, 0, sizeof(sprite)); + dev.spriteInfo = &sprite; + ti = TouchBeginTouch(&dev, sourceid, touchid, TRUE); assert(ti); assert(ti->client_id == touchid); @@ -248,9 +271,9 @@ touch_begin_touch(void) assert(ti->sourceid == sourceid); assert(ti->emulate_pointer); - assert(touch.num_touches == 1); + assert(dev.touch->num_touches == 5); - free(dev.name); + free_device(&dev); } static void @@ -265,6 +288,7 @@ touch_init(void) screenInfo.screens[0] = &screen; memset(&dev, 0, sizeof(dev)); + dev.type = MASTER_POINTER; /* claim it's a master to stop ptracccel */ dev.name = xnfstrdup("test device"); memset(&sprite, 0, sizeof(sprite)); @@ -279,7 +303,7 @@ touch_init(void) assert(rc == TRUE); assert(dev.touch); - free(dev.name); + free_device(&dev); } int