0016-egl-dri3-fix-segfault-in-eglCopyBuffers.patch 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. From 09d413ab8c88e98534b32067e170bdd92c887cc5 Mon Sep 17 00:00:00 2001
  2. From: Brendan King <Brendan.King@imgtec.com>
  3. Date: Thu, 13 Apr 2017 10:12:40 +0100
  4. Subject: [PATCH] egl/dri3: fix segfault in eglCopyBuffers
  5. The loader_dri3_copy_drawable function expected the drawable to have
  6. a fake front buffer, resulting in a segfault if there wasn't one,
  7. when dri3_fence_reset was called.
  8. If there is no fake front buffer, but there are back buffers, use the
  9. current back buffer.
  10. ---
  11. src/loader/loader_dri3_helper.c | 15 ++++++++++++---
  12. 1 file changed, 12 insertions(+), 3 deletions(-)
  13. diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
  14. index 6e825f9..ff6d1ff 100644
  15. --- a/src/loader/loader_dri3_helper.c
  16. +++ b/src/loader/loader_dri3_helper.c
  17. @@ -863,15 +863,24 @@ loader_dri3_copy_drawable(struct loader_dri3_drawable *draw,
  18. xcb_drawable_t dest,
  19. xcb_drawable_t src)
  20. {
  21. + struct loader_dri3_buffer *buffer;
  22. +
  23. + if (draw->have_fake_front)
  24. + buffer = dri3_fake_front_buffer(draw);
  25. + else if (draw->have_back)
  26. + buffer = dri3_back_buffer(draw);
  27. + else
  28. + return;
  29. +
  30. loader_dri3_flush(draw, __DRI2_FLUSH_DRAWABLE, __DRI2_THROTTLE_COPYSUBBUFFER);
  31. - dri3_fence_reset(draw->conn, dri3_fake_front_buffer(draw));
  32. + dri3_fence_reset(draw->conn, buffer);
  33. dri3_copy_area(draw->conn,
  34. src, dest,
  35. dri3_drawable_gc(draw),
  36. 0, 0, 0, 0, draw->width, draw->height);
  37. - dri3_fence_trigger(draw->conn, dri3_fake_front_buffer(draw));
  38. - dri3_fence_await(draw->conn, draw, dri3_fake_front_buffer(draw));
  39. + dri3_fence_trigger(draw->conn, buffer);
  40. + dri3_fence_await(draw->conn, draw, buffer);
  41. }
  42. void