Andrew's git
/
gitweb.git
/ diff
summary
|
log
|
commit
| diff |
tree
commit
grep
author
committer
pickaxe
?
re
revision: note the lack of free() in simplify_merges()
author
Junio C Hamano
<gitster@pobox.com>
Fri, 8 Jun 2012 21:50:22 +0000
(14:50 -0700)
committer
Junio C Hamano
<gitster@pobox.com>
Fri, 8 Jun 2012 22:44:38 +0000
(15:44 -0700)
Among the three similar-looking loops that walk singly linked
commit_list, the first one is only peeking and the same list is
later used for real work. Leave a comment not to mistakenly
free its elements there.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
revision.c
patch
|
blob
|
history
raw
|
patch
|
inline
| side by side (parent:
a52f007
)
diff --git
a/revision.c
b/revision.c
index 00aaefe88580e618ffe4d8630dc70ca3e711547d..814b96ff53dd9f03cb1356bb9b0ab8683952d334 100644
(file)
--- a/
revision.c
+++ b/
revision.c
@@
-2015,23
+2015,31
@@
static struct commit_list **simplify_one(struct rev_info *revs, struct commit *c
static void simplify_merges(struct rev_info *revs)
{
static void simplify_merges(struct rev_info *revs)
{
- struct commit_list *list;
+ struct commit_list *list
, *next
;
struct commit_list *yet_to_do, **tail;
struct commit_list *yet_to_do, **tail;
+ struct commit *commit;
if (!revs->prune)
return;
/* feed the list reversed */
yet_to_do = NULL;
if (!revs->prune)
return;
/* feed the list reversed */
yet_to_do = NULL;
- for (list = revs->commits; list; list = list->next)
- commit_list_insert(list->item, &yet_to_do);
+ for (list = revs->commits; list; list = next) {
+ commit = list->item;
+ next = list->next;
+ /*
+ * Do not free(list) here yet; the original list
+ * is used later in this function.
+ */
+ commit_list_insert(commit, &yet_to_do);
+ }
while (yet_to_do) {
list = yet_to_do;
yet_to_do = NULL;
tail = &yet_to_do;
while (list) {
while (yet_to_do) {
list = yet_to_do;
yet_to_do = NULL;
tail = &yet_to_do;
while (list) {
-
struct commit *
commit = list->item;
-
struct commit_list *
next = list->next;
+ commit = list->item;
+ next = list->next;
free(list);
list = next;
tail = simplify_one(revs, commit, tail);
free(list);
list = next;
tail = simplify_one(revs, commit, tail);
@@
-2043,9
+2051,10
@@
static void simplify_merges(struct rev_info *revs)
revs->commits = NULL;
tail = &revs->commits;
while (list) {
revs->commits = NULL;
tail = &revs->commits;
while (list) {
- struct commit *commit = list->item;
- struct commit_list *next = list->next;
struct merge_simplify_state *st;
struct merge_simplify_state *st;
+
+ commit = list->item;
+ next = list->next;
free(list);
list = next;
st = locate_simplify_state(revs, commit);
free(list);
list = next;
st = locate_simplify_state(revs, commit);