[Mesa-dev] [PATCH 2/3] u_dynarray: return 0 on realloc failure
Haehnle, Nicolai
Nicolai.Haehnle at amd.com
Mon May 13 14:28:54 UTC 2019
This is basically the same issue as with patch #3... it's not so clear
what the best policy actually is.
Cheers,
Nicolai
On 05.05.19 01:24, Caio Marcelo de Oliveira Filho wrote:
> Hi,
>
>>> 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.
>
> You also want to use a temporary variable for capacity. If realloc
> fails and we keep the old data, we also want to keep the old capacity.
>
>
> Caio
>
More information about the mesa-dev
mailing list