diff options
author | panda <daniel.phan36@gmail.com> | 2021-03-03 14:03:06 -0800 |
---|---|---|
committer | panda <daniel.phan36@gmail.com> | 2021-03-03 14:03:06 -0800 |
commit | b9bfe81292bfa77513193fd4ac75e9a1ab0ddc3b (patch) | |
tree | a3edc56a51a47aa8eb6afbd6e50f36ef613ddb1b | |
parent | 935f85131fa106730bbf66d49808b5aca375f729 (diff) | |
download | libgit2-b9bfe81292bfa77513193fd4ac75e9a1ab0ddc3b.tar.gz |
Check git_signature_dup failure
git_signature_dup can have an allocation failure
-rw-r--r-- | src/blame.c | 25 |
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' |