array: Don't use realloc() with zero size in array_compress()

The behavior of realloc(3) with zero size was apparently implementation
defined.  While glibc documents the behavior as equivalent to free(3),
that might not apply to other C libraries.  With C17, this behavior has
been deprecated, and with C23, the behavior is now undefined.  It's also
why valgrind warns about this use.

Hence, when array_compress() would call realloc() with a zero size, we
now call free() explicitly and set the pointer to NULL.

Signed-off-by: Thomas Egerer <thomas.egerer@secunet.com>
This commit is contained in:
Thomas Egerer 2024-09-06 13:29:40 +02:00 committed by Tobias Brunner
parent 957aae8f64
commit cf7fb47788

View File

@ -197,7 +197,17 @@ void array_compress(array_t *array)
}
if (tail)
{
array->data = realloc(array->data, get_size(array, array->count));
size_t size = get_size(array, array->count);
if (size)
{
array->data = realloc(array->data, size);
}
else
{
free(array->data);
array->data = NULL;
}
array->tail = 0;
}
}