[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#147898: xlibs: select() hangs in XDrawString16() when using TrueType with Xinerama



Package: xlibs-data
Version: 4.3.0-7
Severity: normal
Followup-For: Bug #147898

Hi,

this bug has been fixed upstream, see
  http://bugzilla.xfree86.org/show_bug.cgi?id=260
This bugreport contains a backported fix from Mdk for XFree86 4.3.0,
and here is another one shipped by RH (4.3.0-55).
I cannot test these patches myself.

Denis
Created by Mike A. Harris <mharris@redhat.com>

This patch is backported from post 4.3.0 CVS from cvsps patchset 11329.
This patch fixes XFree86 bugzilla bug #260



---------------------
PatchSet 11329 
Date: 2003/07/07 16:34:20
Author: eich
Branch: HEAD
Tag: (none) 
Log:
 282. Fixing deadlock in libXi - when is called _XLockDisplay() twice - when
      calling a Xi function that calls XGetExtensionVersion() (Bugzilla #260,
      Bastien Nocera, Owen Taylor).

Members: 
	lib/Xi/XExtInt.c:3.7->3.8 
	lib/Xi/XGetVers.c:3.4->3.5 
	lib/Xi/XIint.h:3.1->3.2 

diff -u xc/lib/Xi/XExtInt.c:3.7 xc/lib/Xi/XExtInt.c:3.8
--- xc/lib/Xi/XExtInt.c:3.7	Tue Oct 15 20:37:28 2002
+++ xc/lib/Xi/XExtInt.c	Mon Jul  7 11:34:22 2003
@@ -196,7 +196,7 @@
 	    return (-1);
 	    }
 	((XInputData *) info->data)->vers =
-	    XGetExtensionVersion (dpy, "XInputExtension");
+	    _XiGetExtensionVersion (dpy, "XInputExtension");
 	}
 
     if (versions[version_index].major_version > Dont_Check)
diff -u xc/lib/Xi/XGetVers.c:3.4 xc/lib/Xi/XGetVers.c:3.5
--- xc/lib/Xi/XGetVers.c:3.4	Tue Oct 15 20:37:29 2002
+++ xc/lib/Xi/XGetVers.c	Mon Jul  7 11:34:22 2003
@@ -71,12 +71,33 @@
     char		*name;
 #endif
     {       
+    XExtensionVersion		*ext;
+
+    LockDisplay (dpy);
+    ext = _XiGetExtensionVersion (dpy, name);
+    if (ext != NoSuchExtension) { /* This is unlocked in _XiCheckExtInit() */
+	UnlockDisplay (dpy);
+	SyncHandle();
+    }
+    return (ext);
+    }
+
+XExtensionVersion
+#if NeedFunctionPrototypes
+*_XiGetExtensionVersion (
+    register Display 	*dpy,
+    _Xconst char	*name)
+#else
+*_XiGetExtensionVersion (dpy, name)
+    register Display 	*dpy;
+    char		*name;
+#endif
+    {       
     xGetExtensionVersionReq 	*req;
     xGetExtensionVersionReply 	rep;
     XExtensionVersion		*ext;
     XExtDisplayInfo *info = XInput_find_display (dpy);
 
-    LockDisplay (dpy);
     if (_XiCheckExtInit(dpy, Dont_Check) == -1)
 	return ((XExtensionVersion *) NoSuchExtension);
 
@@ -89,8 +110,6 @@
 
     if (! _XReply (dpy, (xReply *) &rep, 0, xTrue)) 
 	{
-	UnlockDisplay(dpy);
-	SyncHandle();
 	return (XExtensionVersion *) NULL;
 	}
     ext = (XExtensionVersion *) Xmalloc (sizeof (XExtensionVersion));
@@ -103,8 +122,6 @@
 	    ext->minor_version = rep.minor_version;
 	    }
 	}
-    UnlockDisplay(dpy);
-    SyncHandle();
     return (ext);
     }
 
diff -u xc/lib/Xi/XIint.h:3.1 xc/lib/Xi/XIint.h:3.2
--- xc/lib/Xi/XIint.h:3.1	Tue Jul 31 20:44:39 2001
+++ xc/lib/Xi/XIint.h	Mon Jul  7 11:34:22 2003
@@ -21,4 +21,11 @@
 #endif
 );
 
+extern XExtensionVersion * _XiGetExtensionVersion(
+#if NeedFunctionPrototypes
+	Display*,
+	_Xconst char*
+#endif
+);
+
 #endif

Reply to: