[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