[PATCH] plug memory leak in diff.c::diff_free_filepair()
authorYasushi SHOJI <yashi@atmark-techno.com>
Sat, 13 Aug 2005 10:58:56 +0000 (19:58 +0900)
committerJunio C Hamano <junkio@cox.net>
Sun, 14 Aug 2005 01:28:55 +0000 (18:28 -0700)
When I run git-diff-tree on big change, it seems the command eats so
much memory.  so I just put git under valgrind to see what's going on.
diff_free_filespec_data() doesn't free diff_filespec itself.

[jc: I ended up doing things slightly differently from Yasushi's
patch.  The original idea was to use free_filespec_data() only to
free the data portion and keep useing the filespec itself, but
no existing code seems to do things that way, so I just yanked
that part out.]

Signed-off-by: Yasushi SHOJI <yashi@atmark-techno.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
diff.c
diffcore-break.c
diffcore.h

diff --git a/diff.c b/diff.c
index 3e52fec..bb2a43b 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -405,14 +405,13 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only)
        return 0;
 }
 
-void diff_free_filespec_data(struct diff_filespec *s)
+void diff_free_filespec(struct diff_filespec *s)
 {
        if (s->should_free)
                free(s->data);
        else if (s->should_munmap)
                munmap(s->data, s->size);
-       s->should_free = s->should_munmap = 0;
-       s->data = NULL;
+       free(s);
 }
 
 static void prep_temp_blob(struct diff_tempfile *temp,
@@ -769,8 +768,8 @@ struct diff_filepair *diff_queue(struct diff_queue_struct *queue,
 
 void diff_free_filepair(struct diff_filepair *p)
 {
-       diff_free_filespec_data(p->one);
-       diff_free_filespec_data(p->two);
+       diff_free_filespec(p->one);
+       diff_free_filespec(p->two);
        free(p);
 }
 
index 06f9a7f..b0c8461 100644 (file)
@@ -231,8 +231,8 @@ static void merge_broken(struct diff_filepair *p,
 
        dp = diff_queue(outq, d->one, c->two);
        dp->score = p->score;
-       diff_free_filespec_data(d->two);
-       diff_free_filespec_data(c->one);
+       diff_free_filespec(d->two);
+       diff_free_filespec(c->one);
        free(d);
        free(c);
 }
index f1b5ca7..633d1ae 100644 (file)
@@ -43,7 +43,7 @@ extern void fill_filespec(struct diff_filespec *, const unsigned char *,
                          unsigned short);
 
 extern int diff_populate_filespec(struct diff_filespec *, int);
-extern void diff_free_filespec_data(struct diff_filespec *);
+extern void diff_free_filespec(struct diff_filespec *);
 
 struct diff_filepair {
        struct diff_filespec *one;