From 9f4e6436496fe561aa124bb2b89e1c6711684d98 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Tue, 21 Aug 2007 10:03:00 -0700 Subject: [PATCH] Ensure the Render extension is initialized before calling XESetCloseDisplay This avoids a potential crash from the Render extension being cleaned up during XCloseDisplay before the cairo CloseDisplay hook goes on to call into XRenderFreePicture. --- src/cairo-xlib-display.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c index c7c3c43cd..b8f35cb85 100644 --- a/src/cairo-xlib-display.c +++ b/src/cairo-xlib-display.c @@ -226,6 +226,7 @@ _cairo_xlib_display_get (Display *dpy) cairo_xlib_display_t *display; cairo_xlib_display_t **prev; XExtCodes *codes; + int major_unused, minor_unused; /* There is an apparent deadlock between this mutex and the * mutex for the display, but it's actually safe. For the @@ -260,6 +261,14 @@ _cairo_xlib_display_get (Display *dpy) if (display == NULL) goto UNLOCK; + /* Xlib calls out to the extension close_display hooks in LIFO + * order. So we have to ensure that all extensions that we depend + * on in our close_display hook are properly initialized before we + * add our hook. For now, that means Render, so we call into its + * QueryVersion function to ensure it gets initialized. + */ + XRenderQueryVersion (dpy, &major_unused, &minor_unused); + codes = XAddExtension (dpy); if (codes == NULL) { free (display);