util: assert alloc is consistent with data in wl_array_add()

struct wl_array may be constructed by users manually from a
foreign data pointer:

    uint32_t states[] = {1, 2, 3};
    struct wl_array arr = {
        .data = states,
        .size = sizeof(states) / sizeof(states[0]),
    };

This is useful to avoid the need to allocate when sending Wayland
messages.

Users need to be careful not to use wl_array_add() on such arrays:
the function will misbehave by leaving garbage at the start of the
new buffer when reallocating.

Add an assert to guard against wl_array_add() calls in this
situation, to have a clear crash instead of undefined behavior.

Signed-off-by: Simon Ser <contact@emersion.fr>
This commit is contained in:
Simon Ser 2026-01-30 09:57:36 +01:00
parent 8b102c3bc4
commit ecdfb8e9a4

View file

@ -24,6 +24,7 @@
* SOFTWARE.
*/
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <stdint.h>
@ -121,6 +122,8 @@ wl_array_add(struct wl_array *array, size_t size)
alloc *= 2;
if (array->alloc < alloc) {
assert(array->alloc > 0 || array->data == NULL);
if (array->alloc > 0)
data = realloc(array->data, alloc);
else