aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2024-10-04 06:58:53 +0200
committerJunio C Hamano <gitster@pobox.com>2024-10-04 07:59:31 -0700
commit2179b5c831f6bc286acda15c7c7f4a573291ee5c (patch)
tree7fe65ef52df45cb578e2999aacf9651d42bb6b4a
parent35730302e995337766805299fa1128c1b9d8988c (diff)
downloadgit-2179b5c831f6bc286acda15c7c7f4a573291ee5c.tar.gz
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>
-rw-r--r--reftable/basics.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/reftable/basics.c b/reftable/basics.c
index c8396dc525..9a949e5cf8 100644
--- a/reftable/basics.c
+++ b/reftable/basics.c
@@ -152,9 +152,11 @@ char **parse_names(char *buf, int size)
next = end;
}
if (p < next) {
- REFTABLE_ALLOC_GROW(names, names_len + 1, names_cap);
- if (!names)
+ char **names_grown = names;
+ REFTABLE_ALLOC_GROW(names_grown, names_len + 1, names_cap);
+ if (!names_grown)
goto err;
+ names = names_grown;
names[names_len] = reftable_strdup(p);
if (!names[names_len++])