Skip to content

Commit 613999c

Browse files
committed
Merge branch 'sg/plug-line-log-leaks'
A handful of leaks in the line-log machinery have been plugged. * sg/plug-line-log-leaks: diff.c: use diff_free_queue() line-log: free the diff queues' arrays when processing merge commits line-log: free diff queue when processing non-merge commits
2 parents 91c43cd + 586d8b5 commit 613999c

File tree

3 files changed

+13
-12
lines changed

3 files changed

+13
-12
lines changed

diff.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5772,6 +5772,13 @@ void diff_free_filepair(struct diff_filepair *p)
57725772
free(p);
57735773
}
57745774

5775+
void diff_free_queue(struct diff_queue_struct *q)
5776+
{
5777+
for (int i = 0; i < q->nr; i++)
5778+
diff_free_filepair(q->queue[i]);
5779+
free(q->queue);
5780+
}
5781+
57755782
const char *diff_aligned_abbrev(const struct object_id *oid, int len)
57765783
{
57775784
int abblen;
@@ -6329,13 +6336,9 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oid
63296336
int diff_flush_patch_id(struct diff_options *options, struct object_id *oid, int diff_header_only)
63306337
{
63316338
struct diff_queue_struct *q = &diff_queued_diff;
6332-
int i;
63336339
int result = diff_get_patch_id(options, oid, diff_header_only);
63346340

6335-
for (i = 0; i < q->nr; i++)
6336-
diff_free_filepair(q->queue[i]);
6337-
6338-
free(q->queue);
6341+
diff_free_queue(q);
63396342
DIFF_QUEUE_CLEAR(q);
63406343

63416344
return result;
@@ -6604,10 +6607,8 @@ void diff_flush(struct diff_options *options)
66046607
if (output_format & DIFF_FORMAT_CALLBACK)
66056608
options->format_callback(q, options, options->format_callback_data);
66066609

6607-
for (i = 0; i < q->nr; i++)
6608-
diff_free_filepair(q->queue[i]);
66096610
free_queue:
6610-
free(q->queue);
6611+
diff_free_queue(q);
66116612
DIFF_QUEUE_CLEAR(q);
66126613
diff_free(options);
66136614

diffcore.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ struct diff_filepair *diff_queue(struct diff_queue_struct *,
162162
struct diff_filespec *,
163163
struct diff_filespec *);
164164
void diff_q(struct diff_queue_struct *, struct diff_filepair *);
165+
void diff_free_queue(struct diff_queue_struct *q);
165166

166167
/* dir_rename_relevance: the reason we want rename information for a dir */
167168
enum dir_rename_relevance {

line-log.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,10 +1089,8 @@ static struct diff_filepair *diff_filepair_dup(struct diff_filepair *pair)
10891089

10901090
static void free_diffqueues(int n, struct diff_queue_struct *dq)
10911091
{
1092-
int i, j;
1093-
for (i = 0; i < n; i++)
1094-
for (j = 0; j < dq[i].nr; j++)
1095-
diff_free_filepair(dq[i].queue[j]);
1092+
for (int i = 0; i < n; i++)
1093+
diff_free_queue(&dq[i]);
10961094
free(dq);
10971095
}
10981096

@@ -1195,6 +1193,7 @@ static int process_ranges_ordinary_commit(struct rev_info *rev, struct commit *c
11951193
if (parent)
11961194
add_line_range(rev, parent, parent_range);
11971195
free_line_log_data(parent_range);
1196+
diff_free_queue(&queue);
11981197
return changed;
11991198
}
12001199

0 commit comments

Comments
 (0)