From 574dca7b2bbb8328fd3ca3fa16042d933fbd02d8 Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Wed, 20 Jun 2012 09:12:44 -0700 Subject: [PATCH] Imported Debian patch 1.11.4-0ubuntu10.3 --- debian/changelog | 13 +++ ...-from-DisableDevice-if-the-device-is.patch | 29 +++++++ ...e-freeing-the-sprite-into-a-function.patch | 62 ++++++++++++++ ...the-sprite-when-disabling-the-device.patch | 31 +++++++ ...sprite-owners-first-when-disabling-p.patch | 41 +++++++++ ...npairing-when-changing-the-hierarchy.patch | 33 +++++++ ...-disable-all-devices-before-shutdown.patch | 85 +++++++++++++++++++ debian/patches/series | 8 ++ 8 files changed, 302 insertions(+) create mode 100644 debian/patches/510-dix-return-early-from-DisableDevice-if-the-device-is.patch create mode 100644 debian/patches/511-dix-move-freeing-the-sprite-into-a-function.patch create mode 100644 debian/patches/512-dix-free-the-sprite-when-disabling-the-device.patch create mode 100644 debian/patches/513-dix-disable-non-sprite-owners-first-when-disabling-p.patch create mode 100644 debian/patches/514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch create mode 100644 debian/patches/515-dix-disable-all-devices-before-shutdown.patch diff --git a/debian/changelog b/debian/changelog index bc906d2..e052fc1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,16 @@ +xorg-server (2:1.11.4-0ubuntu10.3) precise-proposed; urgency=low + + [ Maarten Lankhorst ] + * Add upstream patches for proper device disabling (LP: #1009629) + - 510-dix-return-early-from-DisableDevice-if-the-device-is.patch + - 511-dix-move-freeing-the-sprite-into-a-function.patch + - 512-dix-free-the-sprite-when-disabling-the-device.patch + - 513-dix-disable-non-sprite-owners-first-when-disabling-p.patch + - 514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch + - 515-dix-disable-all-devices-before-shutdown.patch + + -- Chase Douglas Wed, 20 Jun 2012 09:12:44 -0700 + xorg-server (2:1.11.4-0ubuntu10.2) precise-proposed; urgency=low * Release buttons when device is disabled on suspend (LP: #968845) diff --git a/debian/patches/510-dix-return-early-from-DisableDevice-if-the-device-is.patch b/debian/patches/510-dix-return-early-from-DisableDevice-if-the-device-is.patch new file mode 100644 index 0000000..87ae244 --- /dev/null +++ b/debian/patches/510-dix-return-early-from-DisableDevice-if-the-device-is.patch @@ -0,0 +1,29 @@ +From 46adcefb0e08515195d8e49985a4e210395700b3 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Thu, 10 May 2012 12:10:12 +1000 +Subject: [PATCH 07/12] dix: return early from DisableDevice if the device is + already disabled + +Signed-off-by: Peter Hutterer +Reviewed-by: Chase Douglas +--- + dix/devices.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/dix/devices.c b/dix/devices.c +index df46497..6acff4f 100644 +--- a/dix/devices.c ++++ b/dix/devices.c +@@ -428,6 +428,9 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent) + BOOL enabled; + int flags[MAXDEVICES] = { 0 }; + ++ if (!dev->enabled) ++ return TRUE; ++ + for (prev = &inputInfo.devices; + *prev && (*prev != dev); prev = &(*prev)->next); + if (*prev != dev) +-- +1.7.9.5 + diff --git a/debian/patches/511-dix-move-freeing-the-sprite-into-a-function.patch b/debian/patches/511-dix-move-freeing-the-sprite-into-a-function.patch new file mode 100644 index 0000000..d48b876 --- /dev/null +++ b/debian/patches/511-dix-move-freeing-the-sprite-into-a-function.patch @@ -0,0 +1,62 @@ +From e57d6a89027c55fef987cdc259668c48a8b4ea1b Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Thu, 10 May 2012 15:32:20 +1000 +Subject: [PATCH 08/12] dix: move freeing the sprite into a function + +Signed-off-by: Peter Hutterer +Reviewed-by: Chase Douglas +--- + dix/devices.c | 7 +------ + dix/events.c | 12 ++++++++++++ + include/dix.h | 2 ++ + 3 files changed, 15 insertions(+), 6 deletions(-) + +--- a/dix/devices.c ++++ b/dix/devices.c +@@ -949,12 +949,7 @@ + free(classes); + } + +- if (DevHasCursor(dev) && dev->spriteInfo->sprite) { +- if (dev->spriteInfo->sprite->current) +- FreeCursor(dev->spriteInfo->sprite->current, None); +- free(dev->spriteInfo->sprite->spriteTrace); +- free(dev->spriteInfo->sprite); +- } ++ FreeSprite(dev); + + /* a client may have the device set as client pointer */ + for (j = 0; j < currentMaxClients; j++) +--- a/dix/events.c ++++ b/dix/events.c +@@ -3323,6 +3323,18 @@ + #endif + } + ++void FreeSprite(DeviceIntPtr dev) ++{ ++ if (DevHasCursor(dev) && dev->spriteInfo->sprite) { ++ if (dev->spriteInfo->sprite->current) ++ FreeCursor(dev->spriteInfo->sprite->current, None); ++ free(dev->spriteInfo->sprite->spriteTrace); ++ free(dev->spriteInfo->sprite); ++ } ++ dev->spriteInfo->sprite = NULL; ++} ++ ++ + /** + * Update the mouse sprite info when the server switches from a pScreen to another. + * Otherwise, the pScreen of the mouse sprite is never updated when we switch +--- a/include/dix.h ++++ b/include/dix.h +@@ -417,6 +417,9 @@ + DeviceIntPtr /* pDev */, + WindowPtr /* pWin */); + ++extern void FreeSprite( ++ DeviceIntPtr /* pDev */); ++ + extern void UpdateSpriteForScreen( + DeviceIntPtr /* pDev */, + ScreenPtr /* pScreen */); diff --git a/debian/patches/512-dix-free-the-sprite-when-disabling-the-device.patch b/debian/patches/512-dix-free-the-sprite-when-disabling-the-device.patch new file mode 100644 index 0000000..0ba5be4 --- /dev/null +++ b/debian/patches/512-dix-free-the-sprite-when-disabling-the-device.patch @@ -0,0 +1,31 @@ +From df1704365e700d3cf1d36a241bdfc479159a8df7 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Thu, 10 May 2012 15:33:15 +1000 +Subject: [PATCH 09/12] dix: free the sprite when disabling the device + +Disabled devices don't need sprites (they can't send events anyway) and the +device init process is currently geared to check for whether sprite is +present to check if the device should be paired/attached. + +Signed-off-by: Peter Hutterer +Reviewed-by: Chase Douglas +--- + dix/devices.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/dix/devices.c b/dix/devices.c +index a280dee..f134f31 100644 +--- a/dix/devices.c ++++ b/dix/devices.c +@@ -465,6 +465,8 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent) + (void) (*dev->deviceProc) (dev, DEVICE_OFF); + dev->enabled = FALSE; + ++ FreeSprite(dev); ++ + /* now that the device is disabled, we can reset the signal handler's + * last.slave */ + OsBlockSignals(); +-- +1.7.9.5 + diff --git a/debian/patches/513-dix-disable-non-sprite-owners-first-when-disabling-p.patch b/debian/patches/513-dix-disable-non-sprite-owners-first-when-disabling-p.patch new file mode 100644 index 0000000..f8e05ee --- /dev/null +++ b/debian/patches/513-dix-disable-non-sprite-owners-first-when-disabling-p.patch @@ -0,0 +1,41 @@ +From e433d1046c222f9d969c2c28a4651ff9097614f4 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Thu, 10 May 2012 12:42:59 +1000 +Subject: [PATCH 10/12] dix: disable non-sprite-owners first when disabling + paired devices + +If a sprite-owner is to be disabled but still paired, disable the paired +device first. i.e. disabling a master pointer will disable the master +keyboard first. + +Signed-off-by: Peter Hutterer +Reviewed-by: Chase Douglas +--- +Altered to apply to stable + + dix/devices.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +--- a/dix/devices.c ++++ b/dix/devices.c +@@ -477,15 +477,14 @@ + { + for (other = inputInfo.devices; other; other = other->next) + { +- if (other->spriteInfo->paired == dev) +- { +- ErrorF("[dix] cannot disable device, still paired. " +- "This is a bug. \n"); +- return FALSE; +- } ++ if (other->spriteInfo->paired == dev && !other->spriteInfo->spriteOwner) ++ DisableDevice(other, sendevent); + } + } + ++ if (dev->spriteInfo->paired) ++ dev->spriteInfo->paired = NULL; ++ + (void)(*dev->deviceProc)(dev, DEVICE_OFF); + dev->enabled = FALSE; + diff --git a/debian/patches/514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch b/debian/patches/514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch new file mode 100644 index 0000000..19e3d8a --- /dev/null +++ b/debian/patches/514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch @@ -0,0 +1,33 @@ +From 9c0e820216cd1631f75b037b7908d55ac091692c Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Thu, 10 May 2012 12:55:44 +1000 +Subject: [PATCH 11/12] Xi: drop forced unpairing when changing the hierarchy + +Devices are unpaired as needed on DisableDevice now. + +Signed-off-by: Peter Hutterer +Reviewed-by: Chase Douglas +--- + Xi/xichangehierarchy.c | 6 ------ + 1 file changed, 6 deletions(-) + +diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c +index 756aaac..89f16d8 100644 +--- a/Xi/xichangehierarchy.c ++++ b/Xi/xichangehierarchy.c +@@ -293,12 +293,6 @@ remove_master(ClientPtr client, xXIRemoveMasterInfo * r, int flags[MAXDEVICES]) + } + } + +- /* can't disable until we removed pairing */ +- keybd->spriteInfo->paired = NULL; +- ptr->spriteInfo->paired = NULL; +- XTestptr->spriteInfo->paired = NULL; +- XTestkeybd->spriteInfo->paired = NULL; +- + /* disable the remove the devices, XTest devices must be done first + else the sprites they rely on will be destroyed */ + DisableDevice(XTestptr, FALSE); +-- +1.7.9.5 + diff --git a/debian/patches/515-dix-disable-all-devices-before-shutdown.patch b/debian/patches/515-dix-disable-all-devices-before-shutdown.patch new file mode 100644 index 0000000..4853e50 --- /dev/null +++ b/debian/patches/515-dix-disable-all-devices-before-shutdown.patch @@ -0,0 +1,85 @@ +From 4c68f5d395c66f28b56e488cb3cd12f36820357b Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Wed, 9 May 2012 09:21:28 +1000 +Subject: [PATCH 12/12] dix: disable all devices before shutdown + +f3410b97cf9b48a47bee3d15d232f8a88e75f4ef introduced a regression on server +shutdown. If any button or key was held on shutdown (ctrl, alt, backspace +are usually still down) sending a raw event will segfault the server. The +the root windows are set to NULL before calling CloseDownDevices(). + +Avoid this by disabling all devices first when shutting down. Disabled +devices won't send events anymore. + +Master keyboards must be disabled first, otherwise disabling the pointer +will trigger DisableDevice(keyboard) and the keyboard is removed from the +inputInfo.devices list and moved to inputInfo.off_devices. A regular loop +through inputInfo.devices would thus jump to off_devices and not recover. + +Signed-off-by: Peter Hutterer +Acked-by: Chase Douglas +Reviewed-by: Chase Douglas +--- + dix/devices.c | 20 ++++++++++++++++++++ + dix/main.c | 4 ++++ + include/input.h | 2 +- + 3 files changed, 25 insertions(+), 1 deletion(-) + +--- a/dix/devices.c ++++ b/dix/devices.c +@@ -524,6 +524,26 @@ + return TRUE; + } + ++void ++DisableAllDevices(void) ++{ ++ DeviceIntPtr dev, tmp; ++ ++ nt_list_for_each_entry_safe(dev, tmp, inputInfo.devices, next) { ++ if (!IsMaster(dev)) ++ DisableDevice(dev, FALSE); ++ } ++ /* master keyboards need to be disabled first */ ++ nt_list_for_each_entry_safe(dev, tmp, inputInfo.devices, next) { ++ if (dev->enabled && IsMaster(dev) && IsKeyboardDevice(dev)) ++ DisableDevice(dev, FALSE); ++ } ++ nt_list_for_each_entry_safe(dev, tmp, inputInfo.devices, next) { ++ if (dev->enabled) ++ DisableDevice(dev, FALSE); ++ } ++} ++ + /** + * Initialise a new device through the driver and tell all clients about the + * new device. +--- a/dix/main.c ++++ b/dix/main.c +@@ -105,6 +105,7 @@ + #include "privates.h" + #include "registry.h" + #include "client.h" ++#include "exevents.h" + #ifdef PANORAMIX + #include "panoramiXsrv.h" + #else +@@ -294,6 +295,7 @@ + #endif + + UndisplayDevices(); ++ DisableAllDevices(); + + /* Now free up whatever must be freed */ + if (screenIsSaved == SCREEN_SAVER_ON) +--- a/include/input.h ++++ b/include/input.h +@@ -280,7 +280,7 @@ + extern _X_EXPORT Bool DisableDevice( + DeviceIntPtr /*device*/, + BOOL /* sendevent */); +- ++extern void DisableAllDevices(void); + extern int InitAndStartDevices(void); + + extern void CloseDownDevices(void); diff --git a/debian/patches/series b/debian/patches/series index 1b863e7..775d106 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -37,3 +37,11 @@ 506_touchscreen_pointer_emulation_checks.patch 507_touchscreen_fixes.patch 508_device_off_release_buttons.patch + +# Upstream patches +510-dix-return-early-from-DisableDevice-if-the-device-is.patch +511-dix-move-freeing-the-sprite-into-a-function.patch +512-dix-free-the-sprite-when-disabling-the-device.patch +513-dix-disable-non-sprite-owners-first-when-disabling-p.patch +514-Xi-drop-forced-unpairing-when-changing-the-hierarchy.patch +515-dix-disable-all-devices-before-shutdown.patch -- 2.39.2