xnest: Ignore GetImage() error in xnestGetImage()

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
https://bugs.freedesktop.org/show_bug.cgi?id=9488
The applied patch is a version from Dadek Doulik.

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

Reviewed-by: Daniel Stone <daniel@fooishbar.org>
Signed-off-by: Egbert Eich <eich@freedesktop.org>
This commit is contained in:
Radek Doulik 2013-08-13 08:45:47 +02:00 committed by Adam Jackson
parent b902c8abb6
commit 65fca55884
1 changed files with 14 additions and 0 deletions

View File

@ -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 */
}
void
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;