st/mesa: Initialize textures array in st_framebuffer_validate
authorMichel Dänzer <michel.daenzer@amd.com>
Mon, 16 Oct 2017 14:35:18 +0000 (16:35 +0200)
committerMichel Dänzer <michel@daenzer.net>
Wed, 18 Oct 2017 16:28:00 +0000 (18:28 +0200)
And just reference pipe_resources to it in the validate callbacks.

Avoids pipe_resource leaks when st_framebuffer_validate ends up calling
the validate callback multiple times, e.g. when a window is resized.

v2:
* Use generic stable tag instead of Fixes: tag, since the problem could
  already happen before the commit referenced in v1 (Thomas Hellstrom)
* Use memset to initialize the array on the stack instead of allocating
  the array with os_calloc.

Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
src/gallium/state_trackers/dri/dri_drawable.c
src/gallium/state_trackers/glx/xlib/xm_st.c
src/gallium/state_trackers/hgl/hgl.c
src/gallium/state_trackers/osmesa/osmesa.c
src/gallium/state_trackers/wgl/stw_st.c
src/mesa/state_tracker/st_manager.c

index 75a8197d330539a7fbc737c44b1515d894b46c0a..d586b7564ef6dfd20980683fd2b4a8604160331d 100644 (file)
@@ -99,10 +99,8 @@ dri_st_framebuffer_validate(struct st_context_iface *stctx,
       return TRUE;
 
    /* Set the window-system buffers for the state tracker. */
-   for (i = 0; i < count; i++) {
-      out[i] = NULL;
+   for (i = 0; i < count; i++)
       pipe_resource_reference(&out[i], textures[statts[i]]);
-   }
 
    return TRUE;
 }
index 0c42e653c766a53f1a0fb032d46b6f2741c2c520..946b5dcff299f57072f67291e71c1e9d417e13d1 100644 (file)
@@ -245,10 +245,8 @@ xmesa_st_framebuffer_validate(struct st_context_iface *stctx,
       }
    }
 
-   for (i = 0; i < count; i++) {
-      out[i] = NULL;
+   for (i = 0; i < count; i++)
       pipe_resource_reference(&out[i], xstfb->textures[statts[i]]);
-   }
 
    return TRUE;
 }
index 1b702815a3a6af65ab16665d7935dbaadab02079..bbc477a978c510e2467156de8a7e1199ae6d8dd4 100644 (file)
@@ -193,10 +193,8 @@ hgl_st_framebuffer_validate(struct st_context_iface *stctxi,
                //}
        }
 
-       for (i = 0; i < count; i++) {
-               out[i] = NULL;
+       for (i = 0; i < count; i++)
                pipe_resource_reference(&out[i], buffer->textures[statts[i]]);
-       }
 
        return TRUE;
 }
index 2f9558db312cf6c57a9070e2804f7efe9da9b008..44a0cc43812aee00c30d001860bab4eab2945c82 100644 (file)
@@ -432,6 +432,7 @@ osmesa_st_framebuffer_validate(struct st_context_iface *stctx,
 
       templat.format = format;
       templat.bind = bind;
+      pipe_resource_reference(&out[i], NULL);
       out[i] = osbuffer->textures[statts[i]] =
          screen->resource_create(screen, &templat);
    }
index 5e165c89f56d43a53c2ac7af6d5ad73f0724e080..7cf18f0a8b0f31d9db16e488dbeb836939fdad74 100644 (file)
@@ -161,10 +161,8 @@ stw_st_framebuffer_validate(struct st_context_iface *stctx,
       stwfb->fb->must_resize = FALSE;
    }
 
-   for (i = 0; i < count; i++) {
-      out[i] = NULL;
+   for (i = 0; i < count; i++)
       pipe_resource_reference(&out[i], stwfb->textures[statts[i]]);
-   }
 
    stw_framebuffer_unlock(stwfb->fb);
 
index aef87ea8b75030538cf0aa9b8d84be3540bd35ae..eebde6218371b64a564b1a359d0c91d7612a21a2 100644 (file)
@@ -190,6 +190,8 @@ st_framebuffer_validate(struct st_framebuffer *stfb,
    if (stfb->iface_stamp == new_stamp)
       return;
 
+   memset(textures, 0, stfb->num_statts * sizeof(textures[0]));
+
    /* validate the fb */
    do {
       if (!stfb->iface->validate(&st->iface, stfb->iface, stfb->statts,