From 68103b2758029b3c1fbfcf995baa758bfd2676de Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 1 May 2009 18:47:04 -0700 Subject: libdrm/intel: assert that clients are using bo refcounting correctly Add assertions to drm_intel_gem_bo_reference, drm_intel_gem_bo_reference_locked and drm_intel_gem_bo_unreference_locked that the object has not been freed (refcount > 0). Mistakes in refcounting lead to attempts to insert a bo into a free list more than once which causes application failure as empty free lists are dereferenced as buffer objects. Signed-off-by: Keith Packard --- libdrm/intel/intel_bufmgr_gem.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'libdrm') diff --git a/libdrm/intel/intel_bufmgr_gem.c b/libdrm/intel/intel_bufmgr_gem.c index e48778c3..89931d85 100644 --- a/libdrm/intel/intel_bufmgr_gem.c +++ b/libdrm/intel/intel_bufmgr_gem.c @@ -505,6 +505,7 @@ drm_intel_gem_bo_reference(drm_intel_bo *bo) drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr; drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; + assert(bo_gem->refcount > 0); pthread_mutex_lock(&bufmgr_gem->lock); bo_gem->refcount++; pthread_mutex_unlock(&bufmgr_gem->lock); @@ -515,6 +516,7 @@ drm_intel_gem_bo_reference_locked(drm_intel_bo *bo) { drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; + assert(bo_gem->refcount > 0); bo_gem->refcount++; } @@ -549,6 +551,7 @@ drm_intel_gem_bo_unreference_locked(drm_intel_bo *bo) drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr; drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; + assert(bo_gem->refcount > 0); if (--bo_gem->refcount == 0) { struct drm_intel_gem_bo_bucket *bucket; uint32_t tiling_mode; -- cgit v1.2.3