From 5102e4cb8d5055138372a76d1aacb5d700e705b9 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 11 Oct 2023 17:26:40 +0200 Subject: [PATCH] pod: handle realloc failure When realloc fails, the original pointer is untouched so store the result of realloc somewhere else so that we don't cause a leak. --- spa/include/spa/pod/dynamic.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/spa/include/spa/pod/dynamic.h b/spa/include/spa/pod/dynamic.h index 9fd7994e8..9fd177159 100644 --- a/spa/include/spa/pod/dynamic.h +++ b/spa/include/spa/pod/dynamic.h @@ -23,14 +23,15 @@ static int spa_pod_dynamic_builder_overflow(void *data, uint32_t size) struct spa_pod_dynamic_builder *d = (struct spa_pod_dynamic_builder*)data; int32_t old_size = d->b.size; int32_t new_size = SPA_ROUND_UP_N(size, d->extend); - void *old_data = d->b.data; + void *old_data = d->b.data, *new_data; if (old_data == d->data) d->b.data = NULL; - if ((d->b.data = realloc(d->b.data, new_size)) == NULL) + if ((new_data = realloc(d->b.data, new_size)) == NULL) return -errno; - if (old_data == d->data && d->b.data != old_data && old_size > 0) - memcpy(d->b.data, old_data, old_size); + if (old_data == d->data && new_data != old_data && old_size > 0) + memcpy(new_data, old_data, old_size); + d->b.data = new_data; d->b.size = new_size; return 0; }