[Mesa-dev] [PATCH v3] dri3: Prevent multiple freeing of buffers.

Sergii Romantsov sergii.romantsov at gmail.com
Fri Apr 27 07:07:39 UTC 2018


Commit 3160cb86aa92 adds optimization with flag 'reallocate'.
Processing of flag causes buffers freeing while pointer
is still hold in caller stack and than again used to be freed.

Fixes: 3160cb86aa92 "egl/x11: Re-allocate buffers if format is suboptimal"

v2:
 used flag 'busy' instead of introducing new one.
v3:
 added searching for back-buffer after potential freeing previous one.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105906
Signed-off-by: Sergii Romantsov <sergii.romantsov at globallogic.com>
Tested-by: Andriy Khulap <andriy.khulap at globallogic.com>
---
 src/loader/loader_dri3_helper.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
index fe17df1..6524afc 100644
--- a/src/loader/loader_dri3_helper.c
+++ b/src/loader/loader_dri3_helper.c
@@ -1688,6 +1688,7 @@ dri3_get_buffer(__DRIdrawable *driDrawable,
            (buffer_type == loader_dri3_buffer_front && draw->have_fake_front))
           && buffer) {
 
+         buffer->busy = true;
          /* Fill the new buffer with data from an old buffer */
          dri3_fence_await(draw->conn, draw, buffer);
          if (!loader_dri3_blit_image(draw,
@@ -1731,6 +1732,12 @@ dri3_get_buffer(__DRIdrawable *driDrawable,
       draw->buffers[buf_id] = buffer;
    }
    dri3_fence_await(draw->conn, draw, buffer);
+   if (buffer_type == loader_dri3_buffer_back) {
+	   buf_id = dri3_find_back(draw);
+	   if (buf_id < 0)
+		   return NULL;
+   }
+   buffer = draw->buffers[buf_id];
 
    /*
     * Do we need to preserve the content of a previous buffer?
-- 
2.7.4



More information about the mesa-dev mailing list