summaryrefslogtreecommitdiff
path: root/src/refs.c
diff options
context:
space:
mode:
authorEtienne Samson <samson.etienne@gmail.com>2019-12-08 15:25:52 +0100
committerEtienne Samson <samson.etienne@gmail.com>2019-12-13 12:01:10 +0100
commit97b8491b01e99790a9f643a9571baf65fe168ba8 (patch)
tree20909fe04fa4eca5137c98fd06d80c026b94e896 /src/refs.c
parent39f78b0c03ccaffd5c4aae97897b616634cae3cf (diff)
downloadlibgit2-97b8491b01e99790a9f643a9571baf65fe168ba8.tar.gz
refs: rename git_reference__set_name to git_reference__realloc
As git_reference__name will reallocate storage to account for longer names (it's actually allocator-dependent), it will cause all existing pointers to the old object to become dangling, as they now point to freed memory. Fix the issue by renaming to a more descriptive name, and pass a pointer to the actual reference that can safely be invalidated if the realloc succeeds.
Diffstat (limited to 'src/refs.c')
-rw-r--r--src/refs.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/refs.c b/src/refs.c
index 07784302b..29dd1bdeb 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -91,18 +91,23 @@ git_reference *git_reference__alloc(
return ref;
}
-git_reference *git_reference__set_name(
- git_reference *ref, const char *name)
+git_reference *git_reference__realloc(
+ git_reference **ptr_to_ref, const char *name)
{
- size_t namelen = strlen(name);
- size_t reflen;
+ size_t namelen, reflen;
git_reference *rewrite = NULL;
+ assert(ptr_to_ref && name);
+
+ namelen = strlen(name);
+
if (!GIT_ADD_SIZET_OVERFLOW(&reflen, sizeof(git_reference), namelen) &&
!GIT_ADD_SIZET_OVERFLOW(&reflen, reflen, 1) &&
- (rewrite = git__realloc(ref, reflen)) != NULL)
+ (rewrite = git__realloc(*ptr_to_ref, reflen)) != NULL)
memcpy(rewrite->name, name, namelen + 1);
+ *ptr_to_ref = NULL;
+
return rewrite;
}