The resource bo array must already be extended when the target index is
equal to the current size of the array. In addition, avoid a memory leak 
when reallocation fails.

Signed-off-by: Gert Wollny <gert.wol...@collabora.com>
---
The patch doesn't address that the hash overflows at this point, so that values 
in the lookup table may be overwritten and resources search falls back to a 
linear search.

 src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c 
b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c
index 9a96c6eb83..6c03a6b359 100644
--- a/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c
+++ b/src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c
@@ -459,13 +459,18 @@ static void virgl_vtest_add_res(struct virgl_vtest_winsys 
*vtws,
 {
    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) {
+   if (cbuf->cres >= cbuf->nres) {
+      unsigned new_nres = cbuf->nres + 256;
+      struct virgl_hw_res **new_re_bo = REALLOC(cbuf->res_bo,
+                                                cbuf->nres * sizeof(struct 
virgl_hw_buf*),
+                                                new_nres * sizeof(struct 
virgl_hw_buf*));
+      if (!new_re_bo) {
           fprintf(stderr,"failure to add relocation %d, %d\n", cbuf->cres, 
cbuf->nres);
           return;
       }
+
+      cbuf->res_bo = new_re_bo;
+      cbuf->nres = new_nres;
    }
 
    cbuf->res_bo[cbuf->cres] = NULL;
-- 
2.17.1

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

Reply via email to