--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/open-src/xserver/xorg/closedevice.patch Mon Jan 04 11:56:55 2010 -0800
@@ -0,0 +1,43 @@
+From c47e2eaed19fa97dd0479fcc7646809d7fcae472 Mon Sep 17 00:00:00 2001
+From: Alan Coopersmith <[email protected]>
+Date: Mon, 4 Jan 2010 11:36:06 -0800
+Subject: [PATCH] CloseDevice: call XkbRemoveResourceClient before freeing key class struct
+
+XkbRemoveResourceClient() returns immediately if dev->key is NULL.
+CloseDevice calls XkbRemoveResourceClient until it removes all resources.
+
+If we free dev->key and NULL it before XkbRemoveResourceClient, then
+infinite loop ensues, and the server appears to hang on exit or crash.
+
+Signed-off-by: Alan Coopersmith <[email protected]>
+---
+ dix/devices.c | 6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/dix/devices.c b/dix/devices.c
+index 6329d28..92b95ed 100644
+--- a/dix/devices.c
++++ b/dix/devices.c
+@@ -842,6 +842,9 @@ CloseDevice(DeviceIntPtr dev)
+ if(dev->valuator && dev->valuator->accelScheme.AccelCleanupProc)
+ dev->valuator->accelScheme.AccelCleanupProc(dev);
+
++ while (dev->xkb_interest)
++ XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
++
+ xfree(dev->name);
+
+ classes = (ClassesPtr)&dev->key;
+@@ -853,9 +856,6 @@ CloseDevice(DeviceIntPtr dev)
+ FreeAllDeviceClasses(classes);
+ }
+
+- while (dev->xkb_interest)
+- XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
+-
+ if (DevHasCursor(dev) && dev->spriteInfo->sprite) {
+ xfree(dev->spriteInfo->sprite->spriteTrace);
+ xfree(dev->spriteInfo->sprite);
+--
+1.5.6.5
+
--- a/open-src/xserver/xorg/patch-list Mon Jan 04 10:58:44 2010 -0800
+++ b/open-src/xserver/xorg/patch-list Mon Jan 04 11:56:55 2010 -0800
@@ -1,5 +1,6 @@
server-1.7-nominations.patch,-p1
resource-names.patch,-p1
+closedevice.patch,-p1
sun-paths.patch
sun-extramodes.patch
sun-manpage.patch