glx: If DRI2GetBuffers changes the GL context, call it again

By changing the context, it may also invalidate the DRI2 buffer
information, so we need to get that again.

Fixes crashes due to use-after-free with LIBGL_ALWAYS_INDIRECT=1
glxgears and piglit.

Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Michel Dänzer 2014-04-21 17:47:15 +09:00 committed by Eric Anholt
parent f6abfece3e
commit a69907288d

View File

@ -676,6 +676,13 @@ dri2GetBuffers(__DRIdrawable * driDrawable,
if (cx != lastGLContext) { if (cx != lastGLContext) {
lastGLContext = cx; lastGLContext = cx;
cx->makeCurrent(cx); cx->makeCurrent(cx);
/* If DRI2GetBuffers() changed the GL context, it may also have
* invalidated the DRI2 buffers, so let's get them again
*/
buffers = DRI2GetBuffers(private->base.pDraw,
width, height, attachments, count, out_count);
assert(lastGLContext == cx);
} }
if (*out_count > MAX_DRAWABLE_BUFFERS) { if (*out_count > MAX_DRAWABLE_BUFFERS) {
@ -727,6 +734,14 @@ dri2GetBuffersWithFormat(__DRIdrawable * driDrawable,
if (cx != lastGLContext) { if (cx != lastGLContext) {
lastGLContext = cx; lastGLContext = cx;
cx->makeCurrent(cx); cx->makeCurrent(cx);
/* If DRI2GetBuffersWithFormat() changed the GL context, it may also have
* invalidated the DRI2 buffers, so let's get them again
*/
buffers = DRI2GetBuffersWithFormat(private->base.pDraw,
width, height, attachments, count,
out_count);
assert(lastGLContext == cx);
} }
if (*out_count > MAX_DRAWABLE_BUFFERS) { if (*out_count > MAX_DRAWABLE_BUFFERS) {