I changed the patch again to touch only __glXForceCurrent function
From 1fabb089a3993a328eb0aaa68b14932f5c831fcb Mon Sep 17 00:00:00 2001
From: Guilherme Quentel Melo <[email protected]>
Date: Thu, 24 Mar 2016 03:13:30 -0300
Subject: [PATCH xserver v3] glx: avoid memory leak when using indirect
 rendering

When multiple processes are using GL with indirect rendering a race
condition can make drawables refcount never drop to zero.

This situation could happen when there are many X clients using indirect
GLX:

1 - client1: calls glXMakeCurrent

2 - client2: calls glXMakeCurrent
This is the first context switch for this client. So old_context_tag=0

3 - client1: calls glXRender
For the client, its context is already current.
For the server side lastGLContext points to client2's context.

Signed-off-by: Guilherme Quentel Melo <[email protected]>
---
 glx/glxext.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/glx/glxext.c b/glx/glxext.c
index e41b881..c201fba 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -469,6 +469,12 @@ __glXForceCurrent(__GLXclientState * cl, GLXContextTag tag, int *error)
 
     /* Make this context the current one for the GL. */
     if (!cx->isDirect) {
+        /*
+         * If it is being forced, it means that this context was already made
+         * current. So it cannot just be made current again without decrementing
+         * refcount's
+         */
+        (*cx->loseCurrent) (cx);
         lastGLContext = cx;
         if (!(*cx->makeCurrent) (cx)) {
             /* Bind failed, and set the error code.  Bummer */
-- 
2.7.4

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to