summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2011-06-05 16:28:47 +0300
committerAlon Levy <alevy@redhat.com>2011-06-20 12:39:34 +0200
commit0136bc1a4817822df44c4369be9998d147f0920a (patch)
treea3aa5531f2fc36c03e9d0525f05e41cf6123142d
parent397877bf1627b77da81c24f7457b13c493f70e0e (diff)
display/surface: FreeSurfaceInfo: ignore double frees
Cc: Yonit Halperin <yhalperi@redhat.com>
-rw-r--r--display/surface.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/display/surface.h b/display/surface.h
index e677610..0b7edb3 100644
--- a/display/surface.h
+++ b/display/surface.h
@@ -55,10 +55,16 @@ static _inline void FreeSurfaceInfo(PDev *pdev, UINT32 surface_id)
if (surface_id == 0) {
return;
}
-
EngAcquireSemaphore(pdev->Res->surface_sem);
+ DEBUG_PRINT((pdev, 9, "%s: %p: %d\n", __FUNCTION__, pdev, surface_id));
surface = &pdev->Res->surfaces_info[surface_id];
+ if (surface->draw_area.base_mem == NULL) {
+ DEBUG_PRINT((pdev, 9, "%s: %p: %d: double free. safely ignored\n", __FUNCTION__,
+ pdev, surface_id));
+ EngReleaseSemaphore(pdev->Res->surface_sem);
+ return;
+ }
surface->draw_area.base_mem = NULL; /* Mark as not used */
surface->u.next_free = pdev->Res->free_surfaces;
pdev->Res->free_surfaces = surface;