On 3 September 2018 at 13:57, Gert Wollny <gert.wol...@collabora.com> wrote:
> Fixes crash with
>   piglit/bin/map_buffer_range-invalidate CopyBufferSubData \
>                                increment-offset -auto -fbo
>
> * Resize the resource storage already when the count is equal to the
>   allocated size, fixes:
>
>   Invalid write of size 8
>   at 0xB72E4CF: virgl_drm_add_res (virgl_drm_winsys.c:629)
>   by 0xB72E4CF: virgl_drm_emit_res (virgl_drm_winsys.c:663)
>   by 0xB72A44A: virgl_encode_resource_copy_region (virgl_encode.c:776)
>   by 0xB40CD12: st_copy_buffer_subdata (st_cb_bufferobjects.c:585)
>   by 0xB244A3B: _mesa_CopyBufferSubData (bufferobj.c:2940)
>   by 0x109A1E: upload (invalidate.c:169)
>   by 0x109C2F: piglit_display (invalidate.c:215)
>   by 0x4F80FBE: run_test (piglit_fbo_framework.c:52)
>   by 0x4F66E5F: piglit_gl_test_run (piglit-framework-gl.c:229)
>   by 0x10949D: main (invalidate.c:47)
>   Address 0xbe07d30 is 0 bytes after a block of size 4,096 alloc'd
>   at 0x4C31B25: calloc (in
>        /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
>   by 0xB72DAAF: virgl_drm_cmd_buf_create (virgl_drm_winsys.c:567)
>
> * Also resize the space allocated for the handles, fixes:
>
>   Invalid write of size 4
>   at 0xB72E4F0: virgl_drm_add_res (virgl_drm_winsys.c:631)
>   by 0xB72E4F0: virgl_drm_emit_res (virgl_drm_winsys.c:663)
>   by 0xB72A44A: virgl_encode_resource_copy_region (virgl_encode.c:776)
>   by 0xB40CD12: st_copy_buffer_subdata (st_cb_bufferobjects.c:585)
>   by 0xB244A3B: _mesa_CopyBufferSubData (bufferobj.c:2940)
>   by 0x109A1E: upload (invalidate.c:169)
>   by 0x109C2F: piglit_display (invalidate.c:215)
>   by 0x4F80FBE: run_test (piglit_fbo_framework.c:52)
>   by 0x4F66E5F: piglit_gl_test_run (piglit-framework-gl.c:229)
>   by 0x10949D: main (invalidate.c:47)
>   Address 0xbe08570 is 0 bytes after a block of size 2,048 alloc'd
>   at 0x4C2FB0F: malloc (
>     in /usr/lib/valgrind/vgpreload_memcheck-amd64- linux.so)
>   by 0xB72DAC8: virgl_drm_cmd_buf_create (virgl_drm_winsys.c:572)
>
> Fixes: 4b15b5e803e ("virgl: resize resource bo allocation if we need to.")
>
> v2: - Use REALLOC macro and avoid memory leak when re-allocation fails
>     - add Fixes tag (both Emil Velikov)
>     - reorder commit message
>
> Signed-off-by: Gert Wollny <gert.wol...@collabora.com>
> Reviewed-by: Emil Velikov <emil.veli...@collabora.com> (v1)
>
> ---
> I resend it because I didn't apply all the changes Emil suggested, 
> specifically
> I still change to compare for equality.  The new commit message should make it
> clearer what this fixes.
>
Ack. I've throws some nitpicks below, please don't read too much into them.
Earlier R-B still stands.


>  .../winsys/virgl/drm/virgl_drm_winsys.c       | 24 +++++++++++++++----
>  1 file changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c 
> b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
> index aad6430c41..e780a5e514 100644
> --- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
> +++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c
> @@ -617,13 +617,27 @@ static void virgl_drm_add_res(struct virgl_drm_winsys 
> *qdws,
>  {
>     unsigned hash = res->res_handle & (sizeof(cbuf->is_handle_added)-1);
>
> -   if (cbuf->cres > cbuf->nres) {
> -      cbuf->nres += 256;
> -      cbuf->res_bo = realloc(cbuf->res_bo, cbuf->nres * sizeof(struct 
> virgl_hw_buf*));
> -      if (!cbuf->res_bo) {
> -          fprintf(stderr,"failure to add relocation %d, %d\n", cbuf->cres, 
> cbuf->nres);
> +   if (cbuf->cres >= cbuf->nres) {
> +      unsigned new_nres = cbuf->nres + 256;
> +      void *new_ptr = REALLOC(cbuf->res_bo, cbuf->nres * sizeof(struct 
> virgl_hw_buf*),
struct virgl_hw_res **new_bo =

> +                                new_nres * sizeof(struct virgl_hw_buf*));
> +      if (!new_ptr) {
> +          fprintf(stderr,"failure to add relocation %d, %d\n", cbuf->cres, 
> new_nres);
>            return;
>        }
> +      cbuf->res_bo = new_ptr;
> +
> +      new_ptr = REALLOC(cbuf->res_hlist, cbuf->nres * sizeof(uint32_t),
uint32_t *new_hlist =

> +                        new_nres * sizeof(uint32_t));
> +      if (!new_ptr) {
> +          fprintf(stderr,"failure to add hlist relocation %d, %d\n", 
> cbuf->cres, cbuf->nres);
FREE(new_bo);

> +          return;
> +      }
> +      cbuf->res_hlist = new_ptr;
> +      /* This is not perfect, because when the first re-allocation succeeds 
> but
> +       * the second failes the first old_size will be wrong, but currently it
> +       * isn't used anyway. */
Now you can drop the comment.

Aside: the old_size of REALLOC could/should go - debug_realloc can use
old_hdr->size.
Using sizeof(instance) should be clearer and more consistent with the
rest of winsys/virgl.

-Emil
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to