diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2014-04-21 17:47:15 +0900 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2014-04-23 10:32:44 -0700 |
commit | a69907288d59792fd783f2f1756cde03d4a06f97 (patch) | |
tree | 596295b4e4d624457207630e313e0a18b5453306 /glx | |
parent | f6abfece3e59fa8c2e14a61430133816837855f8 (diff) |
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>
Diffstat (limited to 'glx')
-rw-r--r-- | glx/glxdri2.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/glx/glxdri2.c b/glx/glxdri2.c index 7b368d2d6..c756bf570 100644 --- a/glx/glxdri2.c +++ b/glx/glxdri2.c @@ -676,6 +676,13 @@ dri2GetBuffers(__DRIdrawable * driDrawable, if (cx != lastGLContext) { lastGLContext = 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) { @@ -727,6 +734,14 @@ dri2GetBuffersWithFormat(__DRIdrawable * driDrawable, if (cx != lastGLContext) { lastGLContext = 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) { |