summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-06-30 13:03:36 -0700
committerJunio C Hamano <gitster@pobox.com>2015-07-24 15:08:22 -0700
commit8d9b5a4ada8b8e187af7dbdc7bc24f6ed774df80 (patch)
tree6f052ca0461995b5a91e95f2de5b668f068b1216
parent5eda906b2873c986fa61406dafb6acd99e70d540 (diff)
downloadgit-8d9b5a4ada8b8e187af7dbdc7bc24f6ed774df80.tar.gz
rerere: plug conflict ID leaks
The merge_rr string list stores the conflict ID (a hexadecimal string that is used to index into $GIT_DIR/rr-cache) in the .util field of its elements, and when do_plain_rerere() resolves a conflict, the field is cleared. Also, when rerere_forget() recomputes the conflict ID to updates the preimage file, the conflict ID for the path is updated. We forgot to free the existing conflict ID when we did these two operations. Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--rerere.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/rerere.c b/rerere.c
index b453a80085..0f40f89abd 100644
--- a/rerere.c
+++ b/rerere.c
@@ -559,6 +559,7 @@ static int do_plain_rerere(struct string_list *rr, int fd)
fprintf(stderr, "Recorded resolution for '%s'.\n", path);
copy_file(rerere_path(name, "postimage"), path, 0666);
mark_resolved:
+ free(rr->items[i].util);
rr->items[i].util = NULL;
}
@@ -627,6 +628,7 @@ static int rerere_forget_one_path(const char *path, struct string_list *rr)
char *hex;
unsigned char sha1[20];
int ret;
+ struct string_list_item *item;
ret = handle_cache(path, sha1, NULL);
if (ret < 1)
@@ -641,8 +643,9 @@ static int rerere_forget_one_path(const char *path, struct string_list *rr)
handle_cache(path, sha1, rerere_path(hex, "preimage"));
fprintf(stderr, "Updated preimage for '%s'\n", path);
-
- string_list_insert(rr, path)->util = hex;
+ item = string_list_insert(rr, path);
+ free(item->util);
+ item->util = hex;
fprintf(stderr, "Forgot resolution for %s\n", path);
return 0;
}