[Mesa-dev] [PATCH] glx/drisw: avoid segfaults when we fail to get visual

Dave Airlie airlied at gmail.com
Fri Mar 23 11:52:21 PDT 2012


From: Dave Airlie <airlied at redhat.com>

piglit glx-tfp segfaults on llvmpipe when run vs a 16-bit radeon screen,

it now fails instead of segfaulting, much prettier.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/glx/drisw_glx.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
index 9cee25e..95d2dcc 100644
--- a/src/glx/drisw_glx.c
+++ b/src/glx/drisw_glx.c
@@ -91,6 +91,9 @@ XCreateDrawable(struct drisw_drawable * pdp,
    visMask = VisualIDMask;
    pdp->visinfo = XGetVisualInfo(dpy, visMask, &visTemp, &num_visuals);
 
+   if (!pdp->visinfo || num_visuals == 0)
+      return False;
+
    /* create XImage */
    pdp->ximage = XCreateImage(dpy,
                               pdp->visinfo->visual,
@@ -513,7 +516,7 @@ driswCreateDrawable(struct glx_screen *base, XID xDrawable,
    struct drisw_drawable *pdp;
    __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes;
    struct drisw_screen *psc = (struct drisw_screen *) base;
-
+   Bool ret;
    const __DRIswrastExtension *swrast = psc->swrast;
 
    pdp = Xmalloc(sizeof(*pdp));
@@ -525,7 +528,11 @@ driswCreateDrawable(struct glx_screen *base, XID xDrawable,
    pdp->base.drawable = drawable;
    pdp->base.psc = &psc->base;
 
-   XCreateDrawable(pdp, psc->base.dpy, xDrawable, modes->visualID);
+   ret = XCreateDrawable(pdp, psc->base.dpy, xDrawable, modes->visualID);
+   if (!ret) {
+      Xfree(pdp);
+      return NULL;
+   }
 
    /* Create a new drawable */
    pdp->driDrawable =
-- 
1.7.7.6



More information about the mesa-dev mailing list