<div dir="ltr"><div><div>Whilst I don't know that code as well as I'd like. It does get my<br><br></div><span class="">Tested</span>-<span class="">by</span>: Rhys Kidd <<a href="mailto:rhyskidd@gmail.com" target="_blank">rhyskidd@gmail.com</a>><br><br></div>for fixing that piglit on i965 ILK. Thanks for the two patches!<br></div><div class="gmail_extra"><br><div class="gmail_quote">On 15 July 2016 at 04:28, Nicolas Boichat <span dir="ltr"><<a href="mailto:drinkcat@chromium.org" target="_blank">drinkcat@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">android.opengl.cts.WrapperTest#testGetIntegerv1 CTS test calls<br>
eglTerminate, followed by eglReleaseThread. In that case, the<br>
display will not be initialized when eglReleaseThread calls<br>
MakeCurrent with NULL parameters, to unbind the context, which<br>
causes a a segfault in drv->API.MakeCurrent (dri2_make_current),<br>
either in glFlush or in a latter call.<br>
<br>
A similar case is observed in this bug:<br>
<a href="https://bugs.freedesktop.org/show_bug.cgi?id=69622" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=69622</a>, where the test<br>
call eglTerminate, then eglMakeCurrent(dpy, NULL, NULL, NULL).<br>
<br>
This patch:<br>
 1. Validates that the display is initialized, if ctx/dsurf/rsurf<br>
    are not all NULL.<br>
 2. Does not call glFlush/unBindContext is there is no display.<br>
 3. However, it still goes through the normal path as<br>
    drv->API.DestroyContext decrements the reference count on the<br>
    context, and frees the structure.<br>
<br>
Cc: "11.2 12.0" <<a href="mailto:mesa-stable@lists.freedesktop.org">mesa-stable@lists.freedesktop.org</a>><br>
Signed-off-by: Nicolas Boichat <<a href="mailto:drinkcat@chromium.org">drinkcat@chromium.org</a>><br>
---<br>
<br>
I did not actually test the case reported on the bug, only the CTS<br>
test, would be nice if someone can try it out (Rhys? Chad?).<br>
<br>
Applies after "egl/dri2: dri2_make_current: Set EGL error if bindContext<br>
fails", but wanted to keep the 2 patches separate as they are different<br>
problems and discussions.<br>
<br>
 src/egl/drivers/dri2/egl_dri2.c | 13 ++++++++++---<br>
 1 file changed, 10 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c<br>
index 2e97d85..3269e52 100644<br>
--- a/src/egl/drivers/dri2/egl_dri2.c<br>
+++ b/src/egl/drivers/dri2/egl_dri2.c<br>
@@ -1166,7 +1166,8 @@ dri2_destroy_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLContext *ctx)<br>
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);<br>
<br>
    if (_eglPutContext(ctx)) {<br>
-      dri2_dpy->core->destroyContext(dri2_ctx->dri_context);<br>
+      if (dri2_dpy)<br>
+         dri2_dpy->core->destroyContext(dri2_ctx->dri_context);<br>
       free(dri2_ctx);<br>
    }<br>
<br>
@@ -1189,6 +1190,10 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,<br>
    __DRIdrawable *ddraw, *rdraw;<br>
    __DRIcontext *cctx;<br>
<br>
+   /* Check that the display is initialized */<br>
+   if ((ctx != NULL || dsurf != NULL || rsurf != NULL) && !dri2_dpy)<br>
+      return _eglError(EGL_NOT_INITIALIZED, "eglMakeCurrent error");<br>
+<br>
    /* make new bindings */<br>
    if (!_eglBindContext(ctx, dsurf, rsurf, &old_ctx, &old_dsurf, &old_rsurf)) {<br>
       /* _eglBindContext already sets the EGL error (in _eglCheckMakeCurrent) */<br>
@@ -1196,14 +1201,14 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,<br>
    }<br>
<br>
    /* flush before context switch */<br>
-   if (old_ctx && dri2_drv->glFlush)<br>
+   if (old_ctx && dri2_dpy && dri2_drv->glFlush)<br>
       dri2_drv->glFlush();<br>
<br>
    ddraw = (dsurf) ? dri2_dpy->vtbl->get_dri_drawable(dsurf) : NULL;<br>
    rdraw = (rsurf) ? dri2_dpy->vtbl->get_dri_drawable(rsurf) : NULL;<br>
    cctx = (dri2_ctx) ? dri2_ctx->dri_context : NULL;<br>
<br>
-   if (old_ctx) {<br>
+   if (old_ctx && dri2_dpy) {<br>
       __DRIcontext *old_cctx = dri2_egl_context(old_ctx)->dri_context;<br>
       dri2_dpy->core->unbindContext(old_cctx);<br>
    }<br>
@@ -1292,6 +1297,8 @@ static EGLBoolean<br>
 dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)<br>
 {<br>
    struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);<br>
+   if (!dri2_dpy)<br>
+      return EGL_TRUE;<br>
    return dri2_dpy->vtbl->destroy_surface(drv, dpy, surf);<br>
 }<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
2.8.0.rc3.226.g39d4020<br>
<br>
</font></span></blockquote></div><br></div>