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 committed by Pekka Paalanen
parent 290ce2a9c1
commit fe3a02c18a

View file

@ -121,6 +121,9 @@ wl_array_add(struct wl_array *array, size_t size)
alloc *= 2;
if (array->alloc < alloc) {
if (array->alloc == 0 && array->data != NULL)
wl_abort("data is non-NULL with zero alloc");
if (array->alloc > 0)
data = realloc(array->data, alloc);
else