summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpanda <daniel.phan36@gmail.com>2021-03-03 14:03:06 -0800
committerpanda <daniel.phan36@gmail.com>2021-03-03 14:03:06 -0800
commitb9bfe81292bfa77513193fd4ac75e9a1ab0ddc3b (patch)
treea3edc56a51a47aa8eb6afbd6e50f36ef613ddb1b
parent935f85131fa106730bbf66d49808b5aca375f729 (diff)
downloadlibgit2-b9bfe81292bfa77513193fd4ac75e9a1ab0ddc3b.tar.gz
Check git_signature_dup failure
git_signature_dup can have an allocation failure
-rw-r--r--src/blame.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/blame.c b/src/blame.c
index 651b7a003..10e311aee 100644
--- a/src/blame.c
+++ b/src/blame.c
@@ -76,6 +76,14 @@ static git_blame_hunk* new_hunk(
return hunk;
}
+static void free_hunk(git_blame_hunk *hunk)
+{
+ git__free((void*)hunk->orig_path);
+ git_signature_free(hunk->final_signature);
+ git_signature_free(hunk->orig_signature);
+ git__free(hunk);
+}
+
static git_blame_hunk* dup_hunk(git_blame_hunk *hunk)
{
git_blame_hunk *newhunk = new_hunk(
@@ -90,17 +98,14 @@ static git_blame_hunk* dup_hunk(git_blame_hunk *hunk)
git_oid_cpy(&newhunk->orig_commit_id, &hunk->orig_commit_id);
git_oid_cpy(&newhunk->final_commit_id, &hunk->final_commit_id);
newhunk->boundary = hunk->boundary;
- git_signature_dup(&newhunk->final_signature, hunk->final_signature);
- git_signature_dup(&newhunk->orig_signature, hunk->orig_signature);
- return newhunk;
-}
-static void free_hunk(git_blame_hunk *hunk)
-{
- git__free((void*)hunk->orig_path);
- git_signature_free(hunk->final_signature);
- git_signature_free(hunk->orig_signature);
- git__free(hunk);
+ if (git_signature_dup(&newhunk->final_signature, hunk->final_signature) < 0 ||
+ git_signature_dup(&newhunk->orig_signature, hunk->orig_signature) < 0) {
+ free_hunk(newhunk);
+ return NULL;
+ }
+
+ return newhunk;
}
/* Starting with the hunk that includes start_line, shift all following hunks'