egl_dri2: fix double free on drm platforms
authorEmil Velikov <emil.l.velikov@gmail.com>
Fri, 7 Nov 2014 03:33:56 +0000 (03:33 +0000)
committerEmil Velikov <emil.l.velikov@gmail.com>
Fri, 7 Nov 2014 18:29:08 +0000 (18:29 +0000)
Earlier commit failed to attribure that for drm platforms one does not
call dri2_create_screen, thus it does not create the screen and
driver_configs but inherits them from the "display" - gbm.

As such wrap cleanup in Platform != _EGL_PLATFORM_DRM to prevent
the issue and still cleanup correctly for non-drm platforms.

v2:
 - Drop the ifdef HAVE_DRM_PLATFORM, reindent the code and fix the
comment block. Suggested by Ken.

Reported-by: Kenneth Graunke <kenneth@whitecape.org>
Reported-by: Mark Janes <mark.a.janes@intel.com>
Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Reviewed-and-tested-by: Kenneth Graunke <kenneth@whitecape.org> (v1)
src/egl/drivers/dri2/egl_dri2.c

index dcc323918eb47e9eb1f58442dd106e85e557c0cd..eceaf1a820cfd6d97a4882577e893ed48e2cb978 100644 (file)
@@ -707,9 +707,15 @@ dri2_terminate(_EGLDriver *drv, _EGLDisplay *disp)
       break;
    }
 
-   for (i = 0; dri2_dpy->driver_configs[i]; i++)
-      free((__DRIconfig *) dri2_dpy->driver_configs[i]);
-   free(dri2_dpy->driver_configs);
+   /* The drm platform does not create the screen/driver_configs but reuses
+    * the ones from the gbm device. As such the gbm itself is responsible
+    * for the cleanup.
+    */
+   if (disp->Platform != _EGL_PLATFORM_DRM) {
+      for (i = 0; dri2_dpy->driver_configs[i]; i++)
+         free((__DRIconfig *) dri2_dpy->driver_configs[i]);
+      free(dri2_dpy->driver_configs);
+   }
    free(dri2_dpy);
    disp->DriverData = NULL;