i965/sync: Fix uninitalized usage and leak of mutex
authorChad Versace <chadversary@chromium.org>
Wed, 28 Sep 2016 06:33:45 +0000 (23:33 -0700)
committerChad Versace <chadversary@chromium.org>
Thu, 6 Oct 2016 00:09:24 +0000 (17:09 -0700)
We locked an unitialized mutex in the callstack
    glClientWaitSync
    intel_gl_client_wait_sync
    brw_fence_client_wait_sync
because we forgot to initialize it in intel_gl_fence_sync.
(The EGLSync codepath didn't have this bug. It initialized the mutex in
intel_dri_create_sync).

We also forgot to tear down (mtx_destroy) the mutex when destroying
the sync object.

Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/intel_syncobj.c

index dfda44879232aa6d9f7ceefddb698895b60b2d57..4276f3f9954196d0b60733f3c2cb52d8d17ce444 100644 (file)
@@ -57,11 +57,21 @@ struct intel_gl_sync_object {
    struct brw_fence fence;
 };
 
+static void
+brw_fence_init(struct brw_context *brw, struct brw_fence *fence)
+{
+   fence->brw = brw;
+   fence->batch_bo = NULL;
+   mtx_init(&fence->mutex, mtx_plain);
+}
+
 static void
 brw_fence_finish(struct brw_fence *fence)
 {
    if (fence->batch_bo)
       drm_intel_bo_unreference(fence->batch_bo);
+
+   mtx_destroy(&fence->mutex);
 }
 
 static void
@@ -186,6 +196,7 @@ intel_gl_fence_sync(struct gl_context *ctx, struct gl_sync_object *s,
    struct brw_context *brw = brw_context(ctx);
    struct intel_gl_sync_object *sync = (struct intel_gl_sync_object *)s;
 
+   brw_fence_init(brw, &sync->fence);
    brw_fence_insert(brw, &sync->fence);
 }
 
@@ -240,8 +251,7 @@ intel_dri_create_fence(__DRIcontext *ctx)
    if (!fence)
       return NULL;
 
-   mtx_init(&fence->mutex, mtx_plain);
-   fence->brw = brw;
+   brw_fence_init(brw, fence);
    brw_fence_insert(brw, fence);
 
    return fence;