From a5a78d1acb01278d3fe1456252c2def6759a83ba Mon Sep 17 00:00:00 2001 From: Arthur Williams Date: Fri, 18 Feb 2022 16:24:00 -0800 Subject: [PATCH] Xi: Fix segfault when removing slave Kept running into a segfault somewhere in GetDeviceUse whenever I tried to remove a device. This happened on manual removal or on server shutdown. Now in XISendDeviceHierarchyEvent we don't try to read properties of recently removed devices. --- Xi/xichangehierarchy.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c index 504defe56..fb0d50783 100644 --- a/Xi/xichangehierarchy.c +++ b/Xi/xichangehierarchy.c @@ -82,20 +82,24 @@ XISendDeviceHierarchyEvent(int flags[MAXDEVICES]) info = (xXIHierarchyInfo *) &ev[1]; for (dev = inputInfo.devices; dev; dev = dev->next) { - info->deviceid = dev->id; - info->enabled = dev->enabled; - info->use = GetDeviceUse(dev, &info->attachment); - info->flags = flags[dev->id]; - ev->flags |= info->flags; - info++; + if (flags[dev->id] && !(flags[dev->id] & (XIMasterRemoved | XISlaveRemoved))) { + info->deviceid = dev->id; + info->enabled = dev->enabled; + info->use = GetDeviceUse(dev, &info->attachment); + info->flags = flags[dev->id]; + ev->flags |= info->flags; + info++; + } } for (dev = inputInfo.off_devices; dev; dev = dev->next) { - info->deviceid = dev->id; - info->enabled = dev->enabled; - info->use = GetDeviceUse(dev, &info->attachment); - info->flags = flags[dev->id]; - ev->flags |= info->flags; - info++; + if (flags[dev->id] && !(flags[dev->id] & (XIMasterRemoved | XISlaveRemoved))) { + info->deviceid = dev->id; + info->enabled = dev->enabled; + info->use = GetDeviceUse(dev, &info->attachment); + info->flags = flags[dev->id]; + ev->flags |= info->flags; + info++; + } } for (i = 0; i < MAXDEVICES; i++) {