egl_g3d: Check if the creation of pipe or st context fails.
authorChia-I Wu <olvaffe@gmail.com>
Thu, 14 Jan 2010 09:29:12 +0000 (17:29 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Thu, 14 Jan 2010 09:29:48 +0000 (17:29 +0800)
It should not return an incomplete EGLContext to the users.

src/gallium/state_trackers/egl_g3d/common/egl_g3d.c

index 9d5734d46f9c6788a73bb88af47fc973c91ee38c..8b69a8cfcb6110335da6d415cbaab3748dfdb2ae 100644 (file)
@@ -547,7 +547,7 @@ egl_g3d_create_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf,
                        _EGLContext *share, const EGLint *attribs)
 {
    struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
-   struct egl_g3d_context *xshare = egl_g3d_context(share);
+   struct egl_g3d_context *gshare = egl_g3d_context(share);
    struct egl_g3d_config *gconf = egl_g3d_config(conf);
    struct egl_g3d_context *gctx;
    const __GLcontextModes *mode;
@@ -572,8 +572,18 @@ egl_g3d_create_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf,
    mode = &gconf->native->mode;
    gctx->pipe =
       gdpy->native->create_context(gdpy->native, (void *) &gctx->base);
+   if (!gctx->pipe) {
+      free(gctx);
+      return NULL;
+   }
+
    gctx->st_ctx = gctx->stapi->st_create_context(gctx->pipe, mode,
-                        (xshare) ? xshare->st_ctx : NULL);
+                        (gshare) ? gshare->st_ctx : NULL);
+   if (!gctx->st_ctx) {
+      gctx->pipe->destroy(gctx->pipe);
+      free(gctx);
+      return NULL;
+   }
 
    return &gctx->base;
 }