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
This commit is contained in:
Junio C Hamano 2022-11-28 12:13:45 +09:00
Родитель 91c43cde25 586d8b5052
Коммит 613999cc5c
3 изменённых файлов: 13 добавлений и 12 удалений

17
diff.c
Просмотреть файл

@ -5772,6 +5772,13 @@ void diff_free_filepair(struct diff_filepair *p)
free(p); free(p);
} }
void diff_free_queue(struct diff_queue_struct *q)
{
for (int i = 0; i < q->nr; i++)
diff_free_filepair(q->queue[i]);
free(q->queue);
}
const char *diff_aligned_abbrev(const struct object_id *oid, int len) const char *diff_aligned_abbrev(const struct object_id *oid, int len)
{ {
int abblen; int abblen;
@ -6329,13 +6336,9 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oid
int diff_flush_patch_id(struct diff_options *options, struct object_id *oid, int diff_header_only) int diff_flush_patch_id(struct diff_options *options, struct object_id *oid, int diff_header_only)
{ {
struct diff_queue_struct *q = &diff_queued_diff; struct diff_queue_struct *q = &diff_queued_diff;
int i;
int result = diff_get_patch_id(options, oid, diff_header_only); int result = diff_get_patch_id(options, oid, diff_header_only);
for (i = 0; i < q->nr; i++) diff_free_queue(q);
diff_free_filepair(q->queue[i]);
free(q->queue);
DIFF_QUEUE_CLEAR(q); DIFF_QUEUE_CLEAR(q);
return result; return result;
@ -6604,10 +6607,8 @@ void diff_flush(struct diff_options *options)
if (output_format & DIFF_FORMAT_CALLBACK) if (output_format & DIFF_FORMAT_CALLBACK)
options->format_callback(q, options, options->format_callback_data); options->format_callback(q, options, options->format_callback_data);
for (i = 0; i < q->nr; i++)
diff_free_filepair(q->queue[i]);
free_queue: free_queue:
free(q->queue); diff_free_queue(q);
DIFF_QUEUE_CLEAR(q); DIFF_QUEUE_CLEAR(q);
diff_free(options); diff_free(options);

Просмотреть файл

@ -162,6 +162,7 @@ struct diff_filepair *diff_queue(struct diff_queue_struct *,
struct diff_filespec *, struct diff_filespec *,
struct diff_filespec *); struct diff_filespec *);
void diff_q(struct diff_queue_struct *, struct diff_filepair *); void diff_q(struct diff_queue_struct *, struct diff_filepair *);
void diff_free_queue(struct diff_queue_struct *q);
/* dir_rename_relevance: the reason we want rename information for a dir */ /* dir_rename_relevance: the reason we want rename information for a dir */
enum dir_rename_relevance { enum dir_rename_relevance {

Просмотреть файл

@ -1089,10 +1089,8 @@ static struct diff_filepair *diff_filepair_dup(struct diff_filepair *pair)
static void free_diffqueues(int n, struct diff_queue_struct *dq) static void free_diffqueues(int n, struct diff_queue_struct *dq)
{ {
int i, j; for (int i = 0; i < n; i++)
for (i = 0; i < n; i++) diff_free_queue(&dq[i]);
for (j = 0; j < dq[i].nr; j++)
diff_free_filepair(dq[i].queue[j]);
free(dq); free(dq);
} }
@ -1195,6 +1193,7 @@ static int process_ranges_ordinary_commit(struct rev_info *rev, struct commit *c
if (parent) if (parent)
add_line_range(rev, parent, parent_range); add_line_range(rev, parent, parent_range);
free_line_log_data(parent_range); free_line_log_data(parent_range);
diff_free_queue(&queue);
return changed; return changed;
} }