diff options
author | Etienne Samson <samson.etienne@gmail.com> | 2019-12-08 15:25:52 +0100 |
---|---|---|
committer | Etienne Samson <samson.etienne@gmail.com> | 2019-12-13 12:01:10 +0100 |
commit | 97b8491b01e99790a9f643a9571baf65fe168ba8 (patch) | |
tree | 20909fe04fa4eca5137c98fd06d80c026b94e896 /src/refs.c | |
parent | 39f78b0c03ccaffd5c4aae97897b616634cae3cf (diff) | |
download | libgit2-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.c | 15 |
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; } |