[Mesa-dev] [PATCH 2/3] u_dynarray: return 0 on realloc failure

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Sat May 4 23:11:49 UTC 2019


On Sat, May 4, 2019 at 3:25 PM Nicolai Hähnle <nhaehnle at gmail.com> wrote:
>
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> We're not very good at handling out-of-memory conditions in general, but
> this change at least gives the caller the option of handling it.
>
> This happens to fix an error in out-of-memory handling in i965, which has
> the following code in brw_bufmgr.c:
>
>       node = util_dynarray_grow(vma_list, sizeof(struct vma_bucket_node));
>       if (unlikely(!node))
>          return 0ull;
>
> Previously, allocation failure for util_dynarray_grow wouldn't actually
> return NULL when the dynarray was previously non-empty.
> ---
>  src/util/u_dynarray.h | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/src/util/u_dynarray.h b/src/util/u_dynarray.h
> index b30fd7b1154..f6a81609dbe 100644
> --- a/src/util/u_dynarray.h
> +++ b/src/util/u_dynarray.h
> @@ -85,20 +85,22 @@ util_dynarray_ensure_cap(struct util_dynarray *buf, unsigned newcap)
>           buf->capacity = DYN_ARRAY_INITIAL_SIZE;
>
>        while (newcap > buf->capacity)
>           buf->capacity *= 2;
>
>        if (buf->mem_ctx) {
>           buf->data = reralloc_size(buf->mem_ctx, buf->data, buf->capacity);
>        } else {
>           buf->data = realloc(buf->data, buf->capacity);
>        }
> +      if (!buf->data)
> +         return 0;

To keep buf->data valid, put the new value in a temporary variable and
copy it into buf->data on success. If realloc and reralloc_size fail,
the original pointer is still valid, while if we overwrite buf->data
we are guaranteed to leak the data on failure.
>     }
>
>     return (void *)((char *)buf->data + buf->size);
>  }
>
>  static inline void *
>  util_dynarray_grow_cap(struct util_dynarray *buf, int diff)
>  {
>     return util_dynarray_ensure_cap(buf, buf->size + diff);
>  }
> --
> 2.20.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list