summaryrefslogtreecommitdiff
path: root/glx
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2014-04-21 17:47:15 +0900
committerEric Anholt <eric@anholt.net>2014-04-23 10:32:44 -0700
commita69907288d59792fd783f2f1756cde03d4a06f97 (patch)
tree596295b4e4d624457207630e313e0a18b5453306 /glx
parentf6abfece3e59fa8c2e14a61430133816837855f8 (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.c15
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) {