The cleanup sequence was slightly confused as it attempted to clear
pending events for the screen after it had freed those events from the
window's queue. Reorder the sequence so that all the clearing of events
is done first before we free any events.

==31451== Invalid read of size 4
==31451==    at 0x81A6B3E: present_clear_window_flip (present_screen.c:93)
==31451==    by 0x81A6C07: present_destroy_window (present_screen.c:116)
==31451==    by 0x8145796: compDestroyWindow (compwindow.c:608)
==31451==    by 0x8176B6B: DbeDestroyWindow (dbe.c:1318)
==31451==    by 0x80B5A98: FreeWindowResources (window.c:910)
==31451==    by 0x80B5D7B: DeleteWindow (window.c:978)
==31451==    by 0x80A9C85: doFreeResource (resource.c:873)
==31451==    by 0x80AA5F8: FreeClientResources (resource.c:1139)
==31451==    by 0x807BD5E: CloseDownClient (dispatch.c:3384)
==31451==    by 0x80740B5: Dispatch (dispatch.c:406)
==31451==    by 0x80816CD: dix_main (main.c:296)
==31451==    by 0x80D2FA1: main (stubmain.c:34)
==31451==  Address 0x62ae4bc is 20 bytes inside a block of size 108 free'd
==31451==    at 0x4007BCD: free (in 
/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==31451==    by 0x81A8FDF: present_vblank_destroy (present.c:901)
==31451==    by 0x81A6ADF: present_free_window_vblank (present_screen.c:79)
==31451==    by 0x81A6BFC: present_destroy_window (present_screen.c:115)
==31451==    by 0x8145796: compDestroyWindow (compwindow.c:608)
==31451==    by 0x8176B6B: DbeDestroyWindow (dbe.c:1318)
==31451==    by 0x80B5A98: FreeWindowResources (window.c:910)
==31451==    by 0x80B5D7B: DeleteWindow (window.c:978)
==31451==    by 0x80A9C85: doFreeResource (resource.c:873)
==31451==    by 0x80AA5F8: FreeClientResources (resource.c:1139)
==31451==    by 0x807BD5E: CloseDownClient (dispatch.c:3384)
==31451==    by 0x80740B5: Dispatch (dispatch.c:406)

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 present/present_screen.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/present/present_screen.c b/present/present_screen.c
index 25ef681..b475d03 100644
--- a/present/present_screen.c
+++ b/present/present_screen.c
@@ -111,9 +111,9 @@ present_destroy_window(WindowPtr window)
 
     if (window_priv) {
         present_clear_window_notifies(window);
-        present_free_events(window);
-        present_free_window_vblank(window);
         present_clear_window_flip(window);
+        present_free_window_vblank(window);
+        present_free_events(window);
         free(window_priv);
     }
     unwrap(screen_priv, screen, DestroyWindow);
-- 
2.0.0.rc2

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to