reftable/basics: fix segfault when growing `names` array fails

When growing the `names` array fails we would end up with a `NULL` pointer. This causes two problems: - We would run into a segfault because we try to free names that we have assigned to the array already. - We lose track of the old array and cannot free its contents. Fix this issue by using a temporary variable. Like this we do not clobber the old array that we tried to reallocate, which will remain valid when a call to realloc(3P) fails. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Oct 4, 2024 at 06:58 UTC 2179b5c831f6bc286acda15c7c7f4a573291ee5c
1 file changed +4 -2
reftable/basics.c
+4 -2
@@ -152,9 +152,11 @@ char **parse_names(char *buf, int size)
152 next = end;
153 }
154 if (p < next) {
155 - REFTABLE_ALLOC_GROW(names, names_len + 1, names_cap);
156 - if (!names)
155 + char **names_grown = names;
156 + REFTABLE_ALLOC_GROW(names_grown, names_len + 1, names_cap);
157 + if (!names_grown)
158 goto err;
159 + names = names_grown;
160
161 names[names_len] = reftable_strdup(p);
162 if (!names[names_len++])