[PATCH v2] xnest: Ignore GetImage() error in xnestGetImage()

Egbert Eich eich at freedesktop.org
Fri Oct 4 22:43:21 PDT 2013

From: Radek Doulik <rodo at novell.com>

When an Xnest instance is not viewable it will crash when a client in
that instance calls GetImage. This is because the Xnest server will
itself receives a BadMatch error.
This patch ignores the error. The application which has requested the
image will receive garbage - this however is fully legal according
to the specs as obscured areas will always contain garbage if there
isn't some sort of backing store as discussed in
The applied patch is a version from Dadek Doulik.

v2: Call XSync() before changing error handlers as suggested by
    Daniel Stone <daniel at fooishbar.org>.

Signed-off-by: Egbert Eich <eich at freedesktop.org>
 hw/xnest/GCOps.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/hw/xnest/GCOps.c b/hw/xnest/GCOps.c
index e26a136..7b1956d 100644
--- a/hw/xnest/GCOps.c
+++ b/hw/xnest/GCOps.c
@@ -94,15 +94,29 @@ xnestPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
+static int
+xnestIgnoreErrorHandler (Display     *display,
+                         XErrorEvent *event)
+    return False; /* return value is ignored */
 xnestGetImage(DrawablePtr pDrawable, int x, int y, int w, int h,
               unsigned int format, unsigned long planeMask, char *pImage)
     XImage *ximage;
     int length;
+    int (*old_handler)(Display*, XErrorEvent*);
+    /* we may get BadMatch error when xnest window is minimized */
+    XSync(xnestDisplay, False);
+    old_handler = XSetErrorHandler (xnestIgnoreErrorHandler);
     ximage = XGetImage(xnestDisplay, xnestDrawable(pDrawable),
                        x, y, w, h, planeMask, format);
+    XSync(xnestDisplay, False);
+    XSetErrorHandler(old_handler);
     if (ximage) {
         length = ximage->bytes_per_line * ximage->height;

More information about the xorg-devel mailing list