6913965 Xorg 1.7.x goes into infinite loop in crash recovery nv_131
authorAlan Coopersmith <Alan.Coopersmith@Sun.COM>
Mon, 04 Jan 2010 11:56:55 -0800
changeset 873 7d55211061fd
parent 872 28f5979d9007
child 874 217a239177c4
6913965 Xorg 1.7.x goes into infinite loop in crash recovery
open-src/xserver/xorg/closedevice.patch
open-src/xserver/xorg/patch-list
--- /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